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;
}
以及Project
JAX-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) 个答案