not - jsonbackreference manytomany
@JsonIgnore y @JsonBackReference están siendo ignorados (5)
Estoy trabajando con RestEasy, Jboss 7 y EJB 3.1. Estoy creando un servicio web RESTful que devuelve datos en formato JSON.
El problema es que tengo una relación @ManyToOne
en una de mis entidades que causa una recursión infinita durante la serialización. Traté de usar las @JsonIgnore
de @JsonIgnore
y @JsonBackReference
Jackson para solucionar el problema, pero parece como si se estuvieran ignorando por completo y la recursión infinita sigue ocurriendo.
Esta es mi clase de usuario:
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;
}
}
Esto es parte de mi clase de rol:
@JsonManagedReference("role-User")
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "role")
public Set<User> getUsers() {
return this.users;
}
He leído en algún lado que debo registrar a Jackson con mi aplicación para poder usar la anotación Jaxb regular, así que creé una clase
@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;
}
}
El problema con lo anterior es que JaxbAnnotationIntrospector()
está en desuso.
Por favor:
- ¿Tienes alguna idea de por qué las anotaciones de Jackson están siendo ignoradas?
- ¿Cómo puedo usar las anotaciones regulares de JAXB XML en lugar de las de Jackson?
- ¿Qué puedo usar en lugar de
JaxbAnnotationIntrospector()
?
Una respuesta a cualquiera de estas preguntas es apreciada, gracias.
Actualizar:
Por ahora, he excluido a resteasy-jackson-provider
usando jboss-deployment-structure.xml
y en su lugar estoy usando Jettison. Todavía quiero saber cómo podría usar Jackson.
El problema aquí parece estar relacionado con el uso de Set<User>
lugar de List<User>
. Tuve exactamente el mismo problema y al cambiar de Set<User>
a List<User>
solucioné esto; de lo contrario, siempre recibí un error de Infinite recursion
de Jackson. No sé si esto es realmente un error en Jackson o tienes que proporcionar algunas otras anotaciones, etc. cuando utilizas Set
.
Estoy usando la primavera 4.0.1, hibernate 4.3.5, jackson 1.9.2 y STS IDE
tuve la misma excepción, pero se resolvió anotando al colocador por @Transient
idont saber por qué pero funciona bien
Esta es mi entidad de clases User.class
//i get that suggestion from some sites
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
@Entity
@Table(name = "user", catalog = "someSchema")
public class User implements java.io.Serializable {
private String name;
private String password;
private String username;
private Set<Telephone> telephones = new HashSet<Telephone>(0);
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public Set<Telephone> getTelephones() {
return this.telephones;
}
public void setTelephones(Set<Telephone> telephones) {
this.telephones = telephones;
}
}
Telephone.class
@Entity
@Table(name = "telephone", catalog = "someSchema")
public class Telephone implements java.io.Serializable {
private User user;
private String telephone;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
public User getUser() {
return this.user;
}
@Transient
public void setUser(User user) {
this.user = user;
}
}
sobre el registro de jackson en mi aplicación, utilicé xml config
<mvc:annotation-driven>
<mvc:message-converters>
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean
class="web.jsonConverters.HibernateAwareObjectMapper" />
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
y clase mapper
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
Hibernate4Module hm = new Hibernate4Module();
registerModule(hm);
}
}
Mira, tengo algo similar a ti y está funcionando bien para mí ...
@JsonBackReference("promotion-travel")
@ManyToOne(cascade = CascadeType.ALL)
@JoinTable(name="PROMOTION_TRAVEL_REL",
joinColumns = @JoinColumn(name="TRAVEL_ID"),
inverseJoinColumns = @JoinColumn(name="PROMOTION_ID")
)
public Promotion getPromotion(){...
Y esto es lo que tengo en Entity1
@JsonManagedReference("promotion-travel")
@OneToMany(mappedBy="promotion")
public List<Travel> getTravelList(){...
No sé si mover la anotación a la parte superior cambiará cualquier cosa, pero eso es lo único que puedo ver ...
Aclamaciones,
Tuve este problema y obtuve el mismo código al actualizar la versión de la biblioteca de Jackson en mi compilación (pom.xml) de 1.8.x a 1.9.13. Si está utilizando maven, edite su pom.xml para que contenga:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
La documentación no ayuda, pero parece que las referencias posteriores para los conjuntos no eran compatibles con las versiones 1.8.x.
use import com.fasterxml.jackson.annotation.JsonBackReference;
en lugar de import org.codehaus.jackson.annotate.JsonBackReference;
.
Fue el problema para mí.