Sto lavorando con RestEasy, Jboss 7 e EJB 3.1. Sto creando un servizio web RESTful che restituisce i dati in formato JSON.@JsonIgnore e @JsonBackReference sono ignorati
Il problema è che ho una relazione @ManyToOne
su una delle mie entità che causa una ricorsione infinita durante la serializzazione. Ho provato ad usare le annotazioni di Jackson @JsonIgnore
e @JsonBackReference
per risolvere il problema, ma sembra che vengano ignorate totalmente e la ricorsione infinita si sta ancora verificando.
Questo è il mio User Class:
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;
}
}
Questa è una parte della mia classe Ruolo:
@JsonManagedReference("role-User")
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "role")
public Set<User> getUsers() {
return this.users;
}
Ho letto da qualche parte che dovrei registrare Jackson con la mia domanda per essere in grado di utilizzare annotazione Jaxb regolare quindi ho creato una classe
@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;
}
}
Il problema di cui sopra è che JaxbAnnotationIntrospector()
è deprecato.
prega:
- Ha qualche idea del perché le annotazioni Jackson vengono ignorati?
- Come posso utilizzare le normali annotazioni XML JAXB anziché quelle di Jackson?
- Cosa posso utilizzare al posto di
JaxbAnnotationIntrospector()
?
Una risposta a qualsiasi di queste domande è apprezzata, grazie.
Aggiornamento:
Per ora ho escluso resteasy-jackson-provider
utilizzando jboss-deployment-structure.xml
e sto usando Jettison invece. Voglio ancora sapere come potrei usare Jackson!
@GeeKh si prega di provare il suggerimento di cui sopra. – user104309
Questo ha funzionato per me (dopo alcuni giorni di lotta). Era necessario dopo aver aggiornato la versione di Jackson. Grazie user104309! –
Facile da ottenere - stava costruendo contro Jackson 1.9, ma l'ambiente di sviluppo è già stato aggiornato a Jackson 2+, che non sa nulla delle vecchie annotazioni. –