Dam*_*her 35 java rest spring json jackson
这是关于JPA瞬态注释的以下问题的后续操作 为什么JPA有@Transient注释?
我有一个我不想持久的瞬态变量,它标有瞬态注释.但是,当我想从我的其余控制器生成JSON时,此瞬态变量在输出的JSON中不可用.
POJO PublicationVO是直接的,没有花哨的属性,只有一些私有属性(持久化)有getter和setter以及1个瞬态变量.
@RequestMapping(value = { "{publicationId}"}, method = RequestMethod.GET, produces = "application/json")
@ResponseBody public PublicationVO getPublicationDetailsJSON(@PathVariable(value = "publicationId") Integer publicationId) {
LOG.info("Entered getPublicationDetailsJSON - publicationId: " + publicationId);
//Call method to get the publicationVO based on publicationId
PublicationVO publicationVO = publicationServices.getPublicationByIdForRestCalls(publicationId);
LOG.info("publicationVO:{}", publicationVO);
LOG.info("Exiting getPublicationDetailsJSON");
return publicationVO;
}
Run Code Online (Sandbox Code Playgroud)
PublicationVO如下
package com.trinity.domain.dao;
import java.util.Calendar;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.fasterxml.jackson.annotation.JsonInclude;
@Entity
@Table(name = "publication")
public class PublicationVO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Integer id;
@Column(name = "publicationName", unique = false, nullable = false, length = 200)
private String publicationName;
@Column(name = "publicationSource", unique = false, nullable = false, length = 45)
private String publicationSource;
@Column(name = "dateAdded", unique = false, nullable = false)
private Calendar dateAdded;
@Transient
private float percentageProcessed;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPublicationName() {
return publicationName;
}
public void setPublicationName(String publicationName) {
this.publicationName = publicationName;
}
public String getPublicationSource() {
return publicationSource;
}
public void setPublicationSource(String publicationSource) {
this.publicationSource = publicationSource;
}
public Calendar getDateAdded() {
return dateAdded;
}
public void setDateAdded(Calendar dateAdded) {
this.dateAdded = dateAdded;
}
public float getPercentageProcessed() {
return percentageProcessed;
}
public void setPercentageProcessed(float percentageProcessed) {
this.percentageProcessed = percentageProcessed;
}
@Override
public String toString() {
return "PublicationVO [id=" + id + ", publicationName=" + publicationName + ", publicationSource=" + publicationSource + ", dateAdded=" + dateAdded
+ ", percentageProcessed=" + percentageProcessed + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
当我在日志中看到publicationVO的调试语句时,瞬态变量包含在输出中,但在我的客户端代码中,瞬态变量不包含在json响应中.
任何帮助是极大的赞赏.
谢谢你,达米恩
Fid*_*kaj 48
我只是添加了JsonSerialize和JsonDeserialize注释.
@Transient
@JsonSerialize
@JsonDeserialize
private String myField;
Run Code Online (Sandbox Code Playgroud)
m4r*_*tin 28
与我在评论中告诉你的情况相反,由于杰克逊的Hibernate模块,杰克逊在用于序列化实体类的实例时似乎关心JPA注释.
在该模块中,有一个HibernateAnnotationIntrospector,文档引用为
简单的AnnotationIntrospector,它增加了对使用Transient表示可忽略字段(以及Jackson和/或JAXB注释)的支持.
正如您在此处所看到的,Jackson的默认行为是检查@Transient它可以找到的任何注释.
所以最后,您可以通过以下三种方式解决您的问题:
@Transient注释检查(有关实现详细信息,请参阅此答案).PublicationVO方法的返回结果getPublicationDetailsJSON.您必须将值对象中的属性复制到某个时刻返回的对象.@Transient注释并保留属性(但我知道如果这不是你的选项,因为你可能有充分的理由让这个属性首先使JPA瞬态).干杯
Dam*_*her 21
只是为了进一步补充m4rtin提供的答案
我采用了第一种方法 - 配置Jackson(使用HibernateAnnotationIntrospector的setUseTransient方法)来禁用对@Transient注释的检查.
在项目中,我follwed必须遵循以下螺纹的,以避免在非取懒对象序列化杰克逊 避免在非取懒对象杰克逊系列化
要将我的项目配置为不忽略瞬态注释,我按如下方式设置Hibernate4Module
Hibernate4Module hm = new Hibernate4Module();
hm.disable(Feature.USE_TRANSIENT_ANNOTATION);
Run Code Online (Sandbox Code Playgroud)
感谢您对此m4rtin的帮助
小智 9
我同时使用@Transient和@JsonProperty,然后就可以了!
@Transient
@JsonProperty
private String mapImageSrc;
Run Code Online (Sandbox Code Playgroud)
它对我有用:
@Transient
@JsonProperty
Run Code Online (Sandbox Code Playgroud)
在GETTER中(不在私有字段定义中)
和
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
Run Code Online (Sandbox Code Playgroud)
注释课程