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 № 1Avec 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;
}
}