我在将 JAX-RS(在 JBoss Wildfly 容器中)与 JSON 负载和 JPA 关联结合起来时遇到一些问题。以下场景:
有两个 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;
}
接下来,我有一个 JAX-RS 服务来创建具有以下签名的新员工:
@POST
@Consumes({ "application/json" })
public Response create(final Employee employee) {
}
客户端发送的新员工的 JSON 如下所示:
{
"name" : "Sam Sample",
"organization_id" : 2
}
我的问题是,这个 JSON(显然)无法反序列化为“Employee”的实例,因为“organization_id”到相应 JPA 实体的映射失败。
如何配置 JAX-RS(或 Jackson JSON 映射器)以将“orgainization_id”解释为 JPA 实体的 id?
最佳答案
使用 Jackson,您可以定义一个自定义反序列化器(请参阅 this 和 this ),它根据 organization_id
的值获取 Organization
实体。
编辑: 检查此示例,了解如何使用 Jackson 和自定义反序列化器以编程方式(而不是通过注释)配置 JAX-RS:
@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;
}
}
关于java - 反序列化 JAX-RS JSON 对象时解析 JPA 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586687/