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