我正在使用 RestEasy、Jboss 7 和 EJB 3.1。我正在创建一个以 JSON 格式返回数据的 RESTful Web 服务。
问题是我@ManyToOne
与我的一个实体有关系,这会在序列化过程中导致无限递归。我尝试使用杰克逊@JsonIgnore
和@JsonBackReference
注释来解决问题,但似乎它们被完全忽略并且无限递归仍在发生。
这是我的用户类:
class User {
private String userId;
private Role role;
@Id
@Column(name = "\"UserId\"", unique = true, nullable = false, length = 30)
public String getUserId() {
return this.UserId;
}
public void setUserId(String UserId) {
this.UserId = UserId;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "\"RoleId\"", nullable = false)
//I have tried @JsonIgnore without @JsonBackReference
@JsonIgnore
//I have tried @JsonBackReference without @JsonIgnore
//Also I have tried @JsonBackReference and @JsonIgnore together
@JsonBackReference("role-User")
public Role getRole() {
return this.role;
}
}
这是我的角色类的一部分:
@JsonManagedReference("role-User")
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "role")
public Set<User> getUsers() {
return this.users;
}
我在某处读到我应该在我的应用程序中注册 Jackson 以便能够使用常规 Jaxb 注释,所以我创建了一个类
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {
public JacksonContextResolver() {
ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getDeserializationConfig().setAnnotationIntrospector(
introspector);
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
}
public ObjectMapper getContext(Class<?> objectType) {
return objectMapper;
}
}
上述问题已JaxbAnnotationIntrospector()
被弃用。
请:
- 你知道为什么杰克逊注释被忽略了吗?
- 如何使用常规的 JAXB XML 注释而不是 Jackson 的?
- 我可以用什么代替
JaxbAnnotationIntrospector()
?
感谢您对任何这些问题的回答,谢谢。
更新:
现在我已经排除了resteasy-jackson-provider
使用jboss-deployment-structure.xml
,而是使用了 Jettison。我仍然想知道如何使用杰克逊!