/ / Risolvi l'associazione JPA durante la deserializzazione dell'oggetto JSON JSON-RS - java, json, jpa, jackson, jax-rs

Risolvi l'associazione JPA mentre deserializzi l'oggetto JSON JSON-RS - java, json, jpa, jackson, jax-rs

Ho alcuni problemi a combinare JAX-RS (nel contenitore JBoss Wildfly) con il carico utile JSON e con le assiciazioni JPA. Scenario successivo:

Ci sono due entità 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;
}

Successivamente ho un servizio JAX-RS per creare un nuovo dipendente con la seguente firma:

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

Il JSON per un nuovo Impiegato inviato dal client assomiglia a:

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

Il mio problema è che questo JSON (ovviamente) non può essere deserializzato in un'istanza di "Employee" poiché il mapping di "organization_id" all'entità JPA corrispondente fallisce.

Come posso configurare JAX-RS (o il mappatore Jackson JSON) per interpretare "orgainization_id" come id di un'entità JPA?

risposte:

0 per risposta № 1

Con Jackson puoi definire un deserializzatore personalizzato (vedi Questo e Questo) che preleva il Organization entità basata sul valore di organization_id.

modificare: Controlla questo esempio per come configurare JAX-RS usando Jackson con un deserializzatore personalizzato a livello di programmazione (a differenza delle annotazioni):

@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;
}
}