有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据JAXRS/JPA中的bean属性之前的值来验证它?

我在泽西岛和JPA(EclipseLink)上,我有一个Project实体和一个Status实体保存在数据库中:

@Entity
public class Status {
  @Id
  public Long id;

  public String name;

  @OneToMany
  public Set<Status> next;
}

@Entity
public class Project {
  @Id
  public Long id;

  public String title;

  public Status status;
}

以及ProjectJAX-RS资源:

@Path("/projects")
public class ProjectResource {
  @Inject
  private ProjectDAO dao;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public List<Project> getProject() {
    return this.dao.findAll();
  }

  @PUT
  @Path("/{id}")
  @Consumes(MediaType.APPLICATION_JSON)
  public void putProject(Project project, @PathParam("id") Long id) {
    this.dao.update(project);
  }   
}

当一个Project通过PUT更新时,我需要检查如果它的status被更改,新值必须包含在前一个的next集中,例如:

public void validateStatus(Status prevStatus, Status nextStatus) {
  if (!prevStatus.contains(nextStatus)) {
    throw new InvalidStatusException();
  }
}

我试过这个:

@PUT
@Path("/{id}")
@Consumes(MediaType.APPLICATION_JSON)
public void putProject(Project project, @PathParam("id") Long id) {
  Project current = this.dao.find(id);
  this.validateStatus(current.status, project.status);
  this.dao.update(project);
}

但是,由于解组的project.status与使用JPA检索的实例不同,因此检查失败。这当然有效:

public void validateStatus(Status prevStatus, Status nextStatus) {
  for (Status status : prevStatus.next) {
    if (status.id == nextStatus.id) {
      return;
    }
  }
  throw new InvalidStatusException();
}

但这样做时,我没有使用Java Set功能(例如contains),它不适用于持久化实体和更新请求之间更通用的验证检查

我正在寻找一种更好、更通用的方法来验证实体之前的状态


共 (0) 个答案