@jsonignore的作用
作用是json序列化時將java bean中的一些屬性忽略掉,序列化和反序列化都受影響。
http://www.cnblogs.com/toSeeMyDream/p/4437858.html
當表間有One2Many或Many2One時,會發生無限循環的場景,如何破?
只要在Set方法前增加以下注解即可:
@JsonIgnore public Set xxxs() { return this.xxxYyyy; }
http://www.cnblogs.com/tompandas/p/4618668.html
1、@Transient
@Transient表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性;
如果一個屬性並非數據庫表的字段映射,就務必將其標示為@Transient,否則ORM框架默認其注解為@Basic;
//表示該字段在數據庫表中沒有
@Transient
public int getAge() {
return 1+1;
}
Jackson相關:
2、@JsonIgnoreProperties
此注解是類注解,作用是json序列化時將java bean中的一些屬性忽略掉,序列化和反序列化都受影響。
3、@JsonIgnore
此注解用於屬性或者方法上(最好是屬性上),作用和上面的@JsonIgnoreProperties一樣。
4、@JsonFormat
此注解用於屬性或者方法上(最好是屬性上),可以方便的把Date類型直接轉化為我們想要的模式,比如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")
5、@JsonSerialize
此注解用於屬性或者getter方法上,用於在序列化時嵌入我們自定義的代碼,比如序列化一個double時在其后面限制兩位小數點。
6、@JsonDeserialize
此注解用於屬性或者setter方法上,用於在反序列化時可以嵌入我們自定義的代碼,類似於上面的@JsonSerialize
http://www.cnblogs.com/guijl/p/3855329.html
hibernate懶加載和json序列化沖突
假設某 POJO 有屬性如下:
private Set<User> users = new HashSet<>(0); @OneToMany(fetch = FetchType.LAZY, mappedBy = "xuser") public Set<User> getUsers() { return this.users; }
如果我們使用jackson將其序列化,運行時會報錯:
failed to lazily initialize a collection of role ...
解決方法一:
通過 Hibernate 的 OpenSessionInViewFilter 使得 FetchType 為 LAZY 的屬性在序列化時為空,在 web.xml 中添加代碼如下:
<filter> <filter-name>openSession</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>openSession</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
盡管 users 為空,但字段依然保留,對應輸出:
{...,"users":[],...}
解決方法二:
在屬性的 get 方法之前加上注解 @JsonIgnore,如此在轉換為 JSON 時該字段被忽略:
import com.fasterxml.jackson.annotation.JsonIgnore;
…
private Set<User> users = new HashSet<>(0); @JsonIgnore @OneToMany(fetch = FetchType.LAZY, mappedBy = "xuser") public Set<User> getUsers() { return this.users; }
…
注意引入的類是 com.fasterxml.jackson.annotation.JsonIgnore,如果使用 org.codehaus.jackson.annotate.JsonIgnore 則不能生效,見 Spring @JsonIgnore not working 。
解決方法三:
fetch = FetchType.LAZY 改為 fetch = FetchType.EAGER,但這樣會導致每次查詢數據庫都要立即提取 OneToMany 的所有對象,所以非常不推薦。
http://www.cnblogs.com/gugia/p/5117735.html
因為懶加載這個對象屬性只是一個代理對象,如果json直接當作一個存在的屬性去序列化就會出現錯誤,所以就只能這樣了,當然還有其他辦法吧
或者在class上加上
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
public class ProductPrice {
}
或者在這個對象的屬性上面增加 @JsonIgnore 注解
@JsonIgnore
public Set<User> getUsers() {
return this.users;
}
實際我們要做的目的就是為了在MappingJackson2HttpMessageConverter通過aop轉化為json的時候不去理這個屬性
http://www.cnblogs.com/cbread/p/4017987.html
作用是json序列化時將java bean中的一些屬性忽略掉,序列化和反序列化都受影響。
如下:
package com.hzboy.orm; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Transient; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonManagedReference; /** * 系統用戶實體類 * @author tinner * */ @Entity(name = "com.hzboy.orm.User") @Table(name = "sys_user") @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class User extends BaseEntity { /** * */ private static final long serialVersionUID = -1343842065506227012L; public User() { } public User(Integer id) { this.id = id; } // 登錄名 private String loginName; // 密碼123456-b594510740d2ac4261c1b2fe87850d08 private String pswd; // 姓名 private String nickName; // 性別 private Short sex; // 年齡段 private String ageStage; // 是否系統管理員 private boolean systemAdmin; //聯系電話 private String tel; //Email private String email; //是否工程師 private Boolean isEnginner; //是否前端客戶 是則顯示前台html,但同時保留后台相關模塊 private Boolean isFrontUser; //相關部門 private Department department; //相關部門前台描述 private String departmentName; private Integer departmentId; //用戶編號 private String userCode; //附加用於導入 private String idCode; //附加的部門信息 用於計算 private String departmentCode; @Column(name = "login_name") public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } @Column(name = "pswd") public String getPswd() { return pswd; } public void setPswd(String pswd) { this.pswd = pswd; } @Column(name = "nick_name") public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } @Column(name = "sex") public Short getSex() { return sex; } public void setSex(Short sex) { this.sex = sex; } @Column(name = "age_stage") public String getAgeStage() { return ageStage; } public void setAgeStage(String ageStage) { this.ageStage = ageStage; } @Column(name = "system_admin") public boolean isSystemAdmin() { return systemAdmin; } public void setSystemAdmin(boolean systemAdmin) { this.systemAdmin = systemAdmin; } private List<Role> roles; @ManyToMany(fetch = FetchType.LAZY, cascade = (CascadeType.REMOVE)) @JoinTable(name = "sys_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") }) public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } private Integer[] roleIds; @Transient public Integer[] getRoleIds() { return roleIds; } public void setRoleIds(Integer[] roleIds) { this.roleIds = roleIds; } @Column(name="email") public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Column(name="is_enginner") public Boolean getIsEnginner() { return isEnginner; } public void setIsEnginner(Boolean isEnginner) { this.isEnginner = isEnginner; } @Column(name="is_front_user") public Boolean getIsFrontUser() { return isFrontUser; } public void setIsFrontUser(Boolean isFrontUser) { this.isFrontUser = isFrontUser; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } @JsonIgnore @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY) @JoinColumn(name="department_id") public Department getDepartment() { return department; } @JsonManagedReference public void setDepartment(Department department) { this.department = department; } @Transient public String getDepartmentName() { return departmentName; } public void setDepartmentName(String departmentName) { this.departmentName = departmentName; } @Transient public Integer getDepartmentId() { return departmentId; } public void setDepartmentId(Integer departmentId) { this.departmentId = departmentId; } @Column(name="user_code") public String getUserCode() { return userCode; } public void setUserCode(String userCode) { this.userCode = userCode; } @Column(name="id_from_import") public String getIdCode() { return idCode; } public void setIdCode(String idCode) { this.idCode = idCode; } public String getDepartmentCode() { return departmentCode; } public void setDepartmentCode(String departmentCode) { this.departmentCode = departmentCode; } }
上個實體User中的 department屬性就在getDepartment屬性上加了 @JsonIgnore,這個時候從后台推數據到前台的時候,就會把department這個引用屬性給忽略掉。
http://www.mamicode.com/info-detail-578520.html