我在回应PUT请求时遇到了一些问题。除了这两个字段:"created":"null","lastUpdated":"null“之外,所有更改都将被持久化并返回所有数据。我不明白为什么我在这里有个空壳。
然而,在发布后,所有数据都正常工作,所有数据都包含在响应中,包括两个有问题的字段:“创建”:“2014-10-28T19:55:37.889Z”,"lastUpdated":"2014-10-28T19:55:37.889Z“
我的实体看起来如下:
@Entity
@Table(name = "projects")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Project extends AbstractPersistable {
private String key;
private String name;
private String description;
@Column(name = "created_date", nullable = false, updatable = false)
@JsonSerialize(using = DateTimeSerializer.class)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime created;
@Column(name = "last_updated_date", nullable = false)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@JsonSerialize(using = DateTimeSerializer.class)
private DateTime lastUpdated;
@PrePersist
public void onPersist() {
this.created = new DateTime();
this.lastUpdated = new DateTime();
}
@PreUpdate
public void onUpdate() {
this.lastUpdated = new DateTime();
}
//Getter and setter methods这是我的资源类
@Path("/")
@Component
public class ProjectsResource {
@Autowired
private ProjectService projectService;
@POST
@Path("projects")
@Consumes(CustomMediaTypes.SMARTGWT_JSON)
@Produces(CustomMediaTypes.SMARTGWT_JSON)
public Response create(Project project) throws ServiceException {
projectService.createOrSave(project);
ProjectModelsSerializer jsonSerializer = new ProjectModelsSerializer();
jsonSerializer.visit(project);
return Response.status(Response.Status.CREATED).entity(jsonSerializer.asServiceResponse("success")).build();
}
@PUT
@Path("projects")
@Consumes(CustomMediaTypes.SMARTGWT_JSON)
@Produces(CustomMediaTypes.SMARTGWT_JSON)
public Object update(Project project) throws ServiceException {
projectService.createOrSave(project);
ProjectModelsSerializer jsonSerializer = new ProjectModelsSerializer();
jsonSerializer.visit(project);
return Response.status(Response.Status.CREATED).entity(jsonSerializer.asServiceResponse("success")).build();
}发布于 2014-10-30 17:13:41
我猜作为参数的项目实例不是由持久性上下文管理的。
如果在您的javax.persistence.EntityManager#merge方法中调用createOrSave,作为参数提供的实体实例将不会被管理。因此,您无法从数据库中看到任何更改(例如创建日期或最后更新日期)。
但是,javax.persistence.EntityManager#merge创建并返回实体的一个新实例,复制该实体状态,并使此新实例得到管理,并具有创建日期或最后更新日期。
因此,方法projectService.createOrSave(项目)应该返回对托管对象的引用:
Project createOrSave(Project project)引用,可以传递给您的json序列化程序。
javax.persistence.EntityManager#persist访问给持久性上下文的(新)实例。由于这个原因,当您创建一个新项目(使用POST方法)时,它可以工作。
https://stackoverflow.com/questions/26617567
复制相似问题