我有Spring rest服务项目,我正在使用JPA hibernate,我在控制器中面临一个奇怪的问题。以下是代码段:
控制器:
@RequestMapping(method = RequestMethod.POST, value=PATH_SEPERATOR+ CREATE_OR_UPDATE_EVENT_METHOD, headers = ACCEPT_APPLICATION_JSON, produces = APPLICATION_JSON)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
ResponseBean createOrUpdateEvent(@RequestBody Event eventBean)
{
ResponseBean response = new ResponseBean();
try {
String sysId = eventService.createOrUpdateEvent(eventBean);
response.setStatus(OK);
response.setData(sysId);
} catch(Exception ex) {
response = handleException(CREATE_OR_UPDATE_EVENT_METHOD, ex);
return response;
}
return response;
}
Event.java
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "sysId", scope = Event.class)
@Table(name = "event")
public class Event {
@Column(name = "date_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private Date dateTime;
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date dateTime) {
this.dateTime = dateTime;
}
}
当我将createOrUpdateEvent
方法中的日期作为字符串“2014-04-17T17:15:56”(在IST时区中)传递给Event bean时,控制器将其转换为Date with datetime“2014-04-17T22 :45:56“IST考虑以前的时间作为UTC时间。我不明白这种自动转换的行为。我认为这是因为我接受参数为bean,其中bean是JPA Entity。请帮我修理一下。
答案 0 :(得分:1)
您必须考虑几件事情。首先,您缺少所提供的JSON序列化格式的时区信息" yyyy-MM-dd' HH:mm:ss"。有一个格式字符可以添加它 - Z.使用它应该像" yyyy-MM-dd' H&H; mm:ssZ"取决于您的喜好。您应该考虑的另一件事是java.util.Date不能识别TimeZone,而且当您创建一个新的Date(long)时,它总是假定传递的日期在当前时区。
因此,为了解决这个问题,您必须像我告诉你的那样添加(并传递)时区,Json解析器将完成剩下的工作。