write not manytomany jsonmanagedreference jsonbackreference example could json jackson jboss7.x resteasy ejb-3.1

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í.