@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

