所以我正在使用Java,Hibernate,JPA注释,JAX-RS注释,JAXB注释,Jersey和Jackson JSON解析器开发RESTful数据API.
在尝试了Jersey提供的MAPPING和NATURAL JSON符号的各种配置后,我最终决定使用Jackson JSON解析器.除了这一个问题,杰克逊将是完美的……
我遇到的问题是Jackson没有使用JAXB注释“@XmlID”和“@XmlIDREF”,我用它来表示我的实体关系,虽然“@JsonBackReference”和“@JsonManagedReference”帮助这个.在处理直接自引用属性时,这种组合似乎会崩溃.
这似乎是一个相当普遍的问题.你怎么能和杰克逊一起绕过这个限制?
以我的POJO为……
@XmlRootElement
public class Employee implements Serializable {
private Date lastUpdatedOn;
private Employee lastUpdatedBy;
private Integer empId;
@JoinColumn(nullable=false)
@OneToOne
@XmlIDREF
public Employee getLastUpdatedBy() {
return createdBy;
}
public void setLastUpdatedBy(Employee lastUpdatedBy) {
this.lastUpdatedBy = lastUpdatedBy;
}
@Temporal(TemporalType.TIMESTAMP)
public Date getLastUpdatedOn() {
return createdOn;
}
public void setLastUpdatedOn(Date lastUpdatedOn) {
this.lastUpdatedOn = lastUpdatedOn;
}
@XmlID
@XmlJavaTypeAdapter(IntegerAdapter.class)
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
}
……以及以下EmployeeResource ……
@Path("/Employees")
public class EmployeeResource {
private List
我的JAX-RS资源将产生以下错误
org.codehaus.jackson.map.JsonMappingException: Direct self-reference leading to cycle (through reference chain: resources.EmployeeResource["employees"]->java.util.ArrayList[0]->entities.Employee["lastUpdatedBy"])
……但我希望它能产生……
{
"employees" : [ {
"lastUpdatedOn" : 1331149770737,"lastUpdatedBy" : 10150,"empId" : 10150,} ],}
大家提前感谢!
笔记:
>我使用IntegerAdapter.class将其转换为字符串,以便它可以与@XmlID注释一起使用.
>上面描述的Employee和EmployeeResource类只是我实际实现的缩写版本,但它们代表了我的实现中与此直接自引用问题相关的部分.
编辑#1 2012.03.10
对不起,在我这个问题的第一个版本中,我对使用泽西岛的自然符号与我与杰克逊运行的版本之间的版本感到困惑.我已经修改了我的问题,以更准确地反映我与杰克逊的直接自我引用问题.
最佳答案