gpt4 book ai didi

java - 如何解决 Jackson 无法处理 JPA bean 中的直接自引用的问题

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:54 24 4
gpt4 key购买 nike

所以我正在使用 Java、Hibernate、JPA 注释、JAX-RS 注释、JAXB 注释、Jersey 和 Jackson JSON 解析器开发 RESTful 数据 API。

在尝试了 Jersey 提供的 MAPPING 和 NATURAL JSON 符号的各种配置之后,我最终决定改用 Jackson JSON 解析器。除了这个问题, jackson 将是完美的......

我遇到的问题是 Jackson 不使用 JAXB 注释“@XmlID”和“@XmlIDREF”,我用它们来表示我的实体关系,尽管“@JsonBackReference”和“@JsonManagedReference” "帮助解决这个问题。在处理直接自引用属性时,这种组合似乎失效了。

这似乎是一个相当普遍的问题。你们中的任何人如何绕过 Jackson 的这个限制?

将我的 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<Employee> employees;

public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}

@GET
@Path("/{empId}")
public Response getEmployees(
@Context UriInfo ui
, @PathParam("id") Integer empId
) {
this.employees = HibernateUtil.pagedQuery(
Employee.class
, new ArrayList() {
Restrictions.eq("empId",empId)
}
);
return Response.ok(this).build();
}
}

我的 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,
} ],
}

在此先感谢大家!

注意事项:

  1. 我使用 IntegerAdapter.class 将其转换为字符串,以便它可以与 @XmlID 注释一起使用。
  2. 上述 Employee 和 EmployeeResource 类只是我的实际实现的缩写版本,但它们代表了我的实现中与这个直接自引用问题相关的部分。

编辑 #1 2012.03.10抱歉,在这个问题的第一个版本中,我对使用 Jersey 自然符号的版本与使用 Jackson 运行的版本感到困惑。我修改了我的问题,以更准确地反射(reflect)我与 Jackson 之间的直接 self 引用问题。

最佳答案

Jackson 1.x 不支持解析循环引用,但支持处理父/子样式依赖项:this博客条目有更多信息。

Jackson 2.0 将支持任意对象 ID/引用处理,使用新的 @JsonIdentityInfo 注释,因此也许可以用来解决问题。官方 2.0 版本尚未发布,但发布候选版本(最新的是 RC2)已经发布,以防您想看一看。不确定它是否能解决您的问题,但也许会有所帮助。

编辑:实际上,Jackson JAXB 注释模块将支持 2.0.0 的 @XmlID/@XmlIDREF -- 这刚刚实现,请参阅 here .

关于java - 如何解决 Jackson 无法处理 JPA bean 中的直接自引用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9642031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com