java - 反序列化 JAX-RS JSON 对象时解析 JPA 关联

标签 java json jpa jackson jax-rs

我在将 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,您可以定义一个自定义反序列化器(请参阅 thisthis ),它根据 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/

相关文章:

java - 是否可以使用对象而不是类来启动 Activity?

Java:java.util.date 无法转换为 java.sql.Time

java - 为 @ApiOperations 为 springfox swagger2 定义自定义 json 序列化器

sql-server - Jboss - 自动重新连接到 XA 数据源后出现奇怪的异常

java - JPA Hibernate - 将 MySQL 复合键映射到 JPA (Hibernate) 实体

java - 如何从servlet读取数据并将数据传递到JSP

json - 使用 codable 将字符串转换为 Date/Int/Double

c# - 如何在 C# 中计算数组中 JSON 元素的数量

c# - 反序列化从类型参数中的字符串名称引用类型的 JSON

java - 是否有基于非 Id 字段合并的 JPA 功能?