【问题标题】:JPA Entity as an object in a method which consumes application/json in Jax-RSJPA 实体作为在 Jax-RS 中使用 application/json 的方法中的对象
【发布时间】:2014-07-18 06:50:40
【问题描述】:

我的应用程序将根据对 JaxRS 服务的请求使用 JPA 执行一些数据库操作。

以下是我用于 JPA 的实体类。

import javax.annotation.Generated; 
import javax.persistence.*;
import java.util.Date;

@Entity
public class Student  {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private int index;

@Column(length = 25)
private String name;

@Version
@Column(length = 45)
private Date timestamp;

public Student(int index, String name) {
    this.index = index;
    this.name = name;
}

public Student() {
}

public int getIndex() {
    return index;
}

public void setIndex(int index) {
    this.index = index;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

以下是我的 JaxRS 服务中的方法

@POST
@Path("add")
@Consumes("application/json")
public Response addStudent(Student student) {
    return null;
}

请暂时忽略return null;。

在 POST 请求中,这需要有一个如下所示的 json 对象,

'{"name":"Student 1", "index": 12, "id": "1", "timestamp" : "2014-07-21 12:19:12"}'

我怎样才能让像这样的json成为可能,

'{"name":"Student 1", "index": 12}'

【问题讨论】:

    标签: java json jax-rs


    【解决方案1】:

    我认为没有问题 - 参数 student 是一个新实例,id 是自动生成的,您需要在版本化时间戳列中手动设置当前时间。有些实现甚至可以为您完成最后一个。

    【讨论】:

      【解决方案2】:

      您可以添加将版本属性设置为当前时间戳的 JPA @EntityListeners。一个小技巧是强制你的类实现一些可以被 EntityListener 类识别的接口:这样,所有可版本化的类都会在 @PrePersist 和 @PreUpdate 事件上自动进行版本控制:

      public interface IVersionable {
          public void setTimestamp(Date timestamp);
      }
      
      @Entity
      @EntityListeners(MyEntityListener.class)
      public class Student implements IVersionable  {
          // getters/setters omitted
      
          public void setTimestamp(Date timestamp) {
              this.timestamp = timestamp;
          }
      }
      
      public class MyEntityListener {
          @PrePersist
          @PreUpdate
          public void prePersistUpdate(final Object entity) {
              if (entity instanceof IVersionable) {
                  ((IVersionable) entity).setTimestamp(new Date());
              }
          }  
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        • 2013-08-19
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多