/ / Résolvez l'association JPA lors de la désérialisation d'un objet JAX JAX-RS - java, json, jpa, jackson, jax-rs

Résolvez l'association JPA lors de la désérialisation d'un objet JAX-RS JSON - java, json, jpa, jackson, jax-rs

J'ai des problèmes à combiner JAX-RS (dans le conteneur JBoss Wildfly) avec la charge utile JSON et avec les assertations JPA. Scénario suivant:

Il y a deux entités JPA

@Entity
class Organization {
@Id
private long id;

private String name;
}

@Entity
class Empolyee {
@Id
private long id;

@Id
private String name;

@ManyToOne(fetch = FetchType.EAGER)
@JsonProperty("organization_id")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIdentityReference(alwaysAsId = true)
private Organization organization;
}

Ensuite, j'ai un service JAX-RS pour créer un nouvel employé avec la signature suivante:

@POST
@Consumes({ "application/json" })
public Response create(final Employee employee) {
}

Le JSON d'un nouvel employé envoyé par le client ressemble à ceci:

{
"name" : "Sam Sample",
"organization_id" : 2
}

Mon problème est que ce JSON (évidemment) ne peut pas être désérialisé en une instance de "Employee" car le mappage de "organization_id" sur l'entité JPA correspondante échoue.

Comment configurer JAX-RS (ou le mappeur Jackson JSON) pour interpréter "orgainization_id" comme l'identifiant d'une entité JPA?

Réponses:

0 pour la réponse № 1

Avec Jackson, vous pouvez définir un désérialiseur personnalisé (voir ce et ce) qui récupère le Organization entité basée sur la valeur de organization_id.

modifier: Consultez cet exemple pour savoir comment configurer JAX-RS à l'aide de Jackson avec un désérialiseur personnalisé par programme (et non via des annotations):

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {

private ObjectMapper objectMapper;

public JacksonContextResolver() throws Exception {
this.objectMapper = new ObjectMapper().configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule myModule = new SimpleModule("MyModule", new Version(1, 0, 0, null));
myModule.addDeserializer(MyType.class, new MyTypeDeserializer());
objectMapper.registerModule(myModule);

}

public ObjectMapper getContext(Class<?> objectType) {
return objectMapper;
}
}