2014-10-28 3 views
1

У меня есть некоторые проблемы с ответом, который я получаю на запрос 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(); 
} 

ответ

0

Я предполагаю, что ваш экземпляр проекта, используемый в качестве параметра, не управляется контекстом сохранения.

Если вы вызываете javax.persistence.EntityManager # merge в свой метод createOrSave, экземпляр объекта, предоставленный как параметр, не будет управляться. Таким образом, вы не видите никаких изменений в базе данных (например, дата создания или дата последнего обновления).

Однако javax.persistence.EntityManager # merge создает и возвращает новый экземпляр объекта, копирует это состояние объекта и управляет этим новым экземпляром с датой создания или датой последнего обновления.

Таким образом, метод projectService.createOrSave (проект) должен возвращать ссылку на управляемый объект:

Project createOrSave(Project project) 

ссылки, которые вы можете передать вашему JSon сериализатором.

javax.persistence.EntityManager # persist присоединяет (новый) экземпляр, который вы передали контексту персистентности. По этой причине он работает, когда вы создаете новый проект (с методом POST)

+0

Спасибо, что вернулись ко мне. Я изменил @PUT с помощью: Обновленный проект = projectService.createOrSave (проект); ProjectModelsSerializer jsonSerializer = new ProjectModelsSerializer(); jsonSerializer.visit (обновлено); он возвращает только «lastUpdated», «created» по-прежнему равен нулю – user2342259

+0

Действительно, если вы используете слияние, createDate перезаписывается результатом слияния, прежде чем объект возвращается вам (с реализацией спящего режима вы можете взглянуть на ' org.hibernate.tuple.entity.AbstractEntityTuplizer # setPropertyValues'). Что вы можете сделать (в вашем методе createOrSave): 1) объединить вашу сущность, 2) флеш() контекст persitence в базу данных, 3) вызвать refresh (entity) для получения даты создания. –

+0

Возможно, вы посмотрите на http://stackoverflow.com/questions/3228304/jpa-merge-readonly-fields. Другим решением является использование ручного слияния для установки createDate. –

Смежные вопросы