【问题标题】:sending Zoneddatetime field in json to java restful webservice将 json 中的 Zoneddatetime 字段发送到 java restful webservice
【发布时间】:2017-11-04 07:18:30
【问题描述】:

我有一个将数据存储在数据库中的休息服务。在我的 DTO 对象中,我有一个类型为 DOB 的字段: 私人 ZonedDateTime dateOfBirth;

@RequestMapping(value = "/save", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<?> createStudent(@Valid @RequestBody StudentDTO studentDto) {

//I have some more fields in StudentDTO along with dob field.
}

我收到JsonMappingException(Index cannot be parsed) 当我从邮递员发送具有价值的请求时: dateOfBirth":"2017-10-01T01:00

问题:如何将日期时间格式转换为所需格式? 如果我必须转换代码,我应该在哪里写?因为当我从邮递员发送请求时,数据会自动使用@RequestBody绑定到对象。那么,我该如何克服这个问题?

【问题讨论】:

  • 您的依赖项中有jackson-datatype-jsr310 吗?这引入了一组允许使用 java-8 日期时间类的序列化程序。
  • 我使用@JsonDeserialize 编写了自定义反序列化器。下面是代码:@JsonDeserialize(using = ZonedDateDeserializer.class) private ZonedDateTime date; public class ZonedDateDeserializer extends StdDeserializer { public ZonedDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { return ZonedDateTime.parse(parser.readValueAs(String.class));我收到以下错误:无法读取文档:无法在索引 16 处解析文本“2017-10-01T01:00+0000”(通过参考链:

标签: java json rest spring-mvc


【解决方案1】:

您收到此错误是因为您使用了错误的日期格式。

2017-10-01T01:00 不适合ZonedDateTime,因为它没有偏移部分。

正确的表示必须有偏移量,例如:2017-10-01T01:00+02:00,接下来的代码就可以正常工作了:

ZonedDateTime.parse("2017-10-01T01:00+02:00")

同时2017-10-01T01:00可以用LocalDateTime表示,下一条语句将完成而不会出错:

LocalDateTime.parse("2017-10-01T01:00")

注意:您不必编写自己的反序列化器,已经实现了 everlasting,只需使用 jackson-datatype-jsr310

【讨论】:

  • 感谢您的回复。我对此有疑问。如果我从邮递员发送日期为“yyyy-mm-dd”,如何将其转换为 java 代码中的 Zoneddatetime 格式。
  • 您希望它拥有什么时区?
  • 我可以设置一些默认时区吗?
  • 当然可以,例如可以在 java 代码中添加缺失的时间和偏移量。但我认为这是个坏主意。如果您不使用时区操作,则使用 ZonedDateTime 毫无意义。尝试使用正确的 java 类型来表示这个日期,例如。 “yyyy-mm-dd”可以通过LocalDate表示。
  • 好的。如果我得到以下格式的日期:2017-11-05 18:30:00+0000,我想将其转换为 2017-11-05 18:30:00+ 00:00。我做了这样的事情: DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss+XX:XX"); ZonedDateTime z = ZonedDateTime.parse(s, formatter);现在我得到“ Text '2017-11-05 18:30:00+0000' could not be parsed at index 20 ”。
猜你喜欢
  • 1970-01-01
  • 2013-10-15
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多