我对PUT请求的响应有一些问题。所有更改都会保留并返回除以下两个字段之外的所有数据:“created”:“null”,“lastUpdated”:“null”。我不明白为什么我在这里得到一个空虚。
在POST上,一切正常,正如预期的那样,所有数据都包含在响应中,包括两个有问题的字段:“created”:“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();
}
答案 0 :(得分:0)
我猜你用作参数的项目实例不是由Persistence Context管理的。
如果在createOrSave方法中调用javax.persistence.EntityManager #incin,则不会管理作为参数提供的实体实例。因此,您无法从数据库中看到任何更改(如创建日期或上次更新日期)。
但是,javax.persistence.EntityManager#merge创建并返回实体的新实例,复制此实体状态,并使用创建日期或上次更新日期管理此新实例。
因此,方法projectService.createOrSave(project)应该返回对托管对象的引用:
Project createOrSave(Project project)
您可以传递给json序列化程序的参考。
javax.persistence.EntityManager #persist将您提供的(新)实例附加到持久性上下文。因此,它在您创建新项目时使用(使用POST方法)