У меня есть некоторые проблемы с ответом, который я получаю на запрос PUT. Все изменения сохраняются и возвращают все данные, кроме этих двух полей: «created»: «null», «lastUpdated»: «null». Я не понимаю, почему я здесь получаю нуль.Spring, Creation и lastUpdate return 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();
}
Спасибо, что вернулись ко мне. Я изменил @PUT с помощью: Обновленный проект = projectService.createOrSave (проект); ProjectModelsSerializer jsonSerializer = new ProjectModelsSerializer(); jsonSerializer.visit (обновлено); он возвращает только «lastUpdated», «created» по-прежнему равен нулю – user2342259
Действительно, если вы используете слияние, createDate перезаписывается результатом слияния, прежде чем объект возвращается вам (с реализацией спящего режима вы можете взглянуть на ' org.hibernate.tuple.entity.AbstractEntityTuplizer # setPropertyValues'). Что вы можете сделать (в вашем методе createOrSave): 1) объединить вашу сущность, 2) флеш() контекст persitence в базу данных, 3) вызвать refresh (entity) для получения даты создания. –
Возможно, вы посмотрите на http://stackoverflow.com/questions/3228304/jpa-merge-readonly-fields. Другим решением является использование ручного слияния для установки createDate. –