【发布时间】:2017-03-12 16:44:15
【问题描述】:
我已经在 SO 中阅读了几个关于java.time.LocalDateTime 和 JSON 属性之间的序列化和反序列化的问题,但我似乎无法让它工作。
我已设法将我的 Spring Boot 应用程序配置为以我想要的格式 (YYY-MM-dd HH:mm) 返回日期,但我在接受这种 JSON 格式的值时遇到问题。
这些是我到目前为止所做的所有事情:
为jsr310添加了maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
在我的主课中指定jsr310:
@EntityScan(basePackageClasses = { App.class, Jsr310JpaConverters.class })
在application.properties 中禁用序列化作为时间戳:
spring.jackson.serialization.write_dates_as_timestamps=false
这是我的日期时间实体映射:
@Column(name = "start_date")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
@JsonFormat(pattern = "YYYY-MM-dd HH:mm")
private LocalDateTime startDate;
在我的数据库中,我将此日期存储为 TIMESTAMP,格式如下:2016-12-01T23:00:00+00:00。
如果我通过控制器访问该实体,它会返回具有正确 startDate 格式的 JSON。但是,当我尝试使用YYYY-MM-dd HH:mm 格式发布并反序列化它时,出现以下异常:
{
"timestamp": "2016-10-30T14:22:25.285+0000",
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "Could not read document: Can not deserialize value of type java.time.LocalDateTime from String \"2017-01-01 20:00\": Text '2017-01-01 20:00' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=1, WeekBasedYear[WeekFields[SUNDAY,1]]=2017, DayOfMonth=1},ISO resolved to 20:00 of type java.time.format.Parsed\n at [Source: java.io.PushbackInputStream@679a734d; line: 6, column: 16] (through reference chain: com.gigsterous.api.model.Event[\"startDate\"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.time.LocalDateTime from String \"2017-01-01 20:00\": Text '2017-01-01 20:00' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=1, WeekBasedYear[WeekFields[SUNDAY,1]]=2017, DayOfMonth=1},ISO resolved to 20:00 of type java.time.format.Parsed\n at [Source: java.io.PushbackInputStream@679a734d; line: 6, column: 16] (through reference chain: com.gigsterous.api.model.Event[\"startDate\"])",
"path": "/api/events"
}
我知道关于这个主题有很多答案,但是关注他们并尝试了几个小时并没有帮助我弄清楚我做错了什么,所以如果有人能向我指出我错过了什么,我会很高兴.感谢您对此的任何意见!
编辑:这些是该过程中涉及的所有类:
存储库:
@Repository
public interface EventRepository extends PagingAndSortingRepository<Event, Long> {
}
控制器:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Event> createEvent(@RequestBody Event event) {
return new ResponseEntity<>(eventRepo.save(event), HttpStatus.CREATED);
}
我的 JSON 请求payalod:
{
"name": "Test",
"startDate": "2017-01-01 20:00"
}
事件:
@Entity
@Table(name = "events")
@Getter
@Setter
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "event_id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "start_date")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
@JsonFormat(pattern = "YYYY-MM-dd HH:mm")
private LocalDateTime startDate;
}
【问题讨论】:
-
能否请您分享其余的跟踪信息,以便我们都可以验证哪些类参与解析该值? DateTimeFormat 注释也显得格格不入
-
@Ivan 我将所有详细信息添加到我的问题中并更新了跟踪
-
你做了什么特别的事情让它输出这样的错误信息吗?我有一个类似的问题,除了我的 localdatetime 在发布请求中只是作为 null 出现,即使我可以执行 Get 并且它的格式很好。
标签: java json jpa spring-boot jackson