如果作为 URL 请求参数发送,则 ZonedDateTime 未正确解析
ZonedDateTime Not Parsed Correctly If Sent As URL Request Parameter
我有一个控制器,它接受代表可选请求参数的 POJO (MySearch
)。当包含 id
and/or name
参数时请求成功。
但是,如果我像这样包含 dateTime
参数:
GET /find?dateTime=2019-03-15T22:17:42Z&id=1432&name=Bob
我得到一个错误:
Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime]
for value '2019-03-15T22:17:42Z'; nested exception is java.lang.IllegalArgumentException:
Parse attempt failed for value [2019-03-15T22:17:42Z]
我也尝试用 @DateTimeFormat(iso = ISO.DATE_TIME)
注释 dateTime
字段,但这没有帮助。
其他测试中 ZonedDateTime
字段的序列化在输出中成功格式化类似于 yyyy-MM-ddTHH:mm:ssZ
的 date/time。
只有 POJO 中 ZonedDateTime
字段的 反序列化 我遇到了困难。
控制器
@RestController
public class MyController {
@GetMapping("/find")
public MyResponse find(MySearch search) {
// Do stuff ...
}
}
POJO
public class MySearch {
private Integer id;
private String name;
private ZonedDateTime dateTime;
}
配置
我使用这两个 bean 配置了 ObjectMapper
:
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return Jackson2ObjectMapperBuilder.json()
.modulesToInstall(new Jdk8Module(), new JavaTimeModule())
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.build();
}
我错过了什么或做错了什么?
谢谢!
如果你想反序列化这个对象,你需要将它注册为一个新的转换器。为此,您可以创建一个类似于此的 class:
@Configuration
public class ZoneDateTimeWebMvcConfigurator implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToZoneDateTime());
}
static class StringToZoneDateTime implements Converter<String, ZonedDateTime> {
@Override
public ZonedDateTime convert(String value) {
return ZonedDateTime.parse(value);
}
}
}
我有一个控制器,它接受代表可选请求参数的 POJO (MySearch
)。当包含 id
and/or name
参数时请求成功。
但是,如果我像这样包含 dateTime
参数:
GET /find?dateTime=2019-03-15T22:17:42Z&id=1432&name=Bob
我得到一个错误:
Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime]
for value '2019-03-15T22:17:42Z'; nested exception is java.lang.IllegalArgumentException:
Parse attempt failed for value [2019-03-15T22:17:42Z]
我也尝试用 @DateTimeFormat(iso = ISO.DATE_TIME)
注释 dateTime
字段,但这没有帮助。
其他测试中 ZonedDateTime
字段的序列化在输出中成功格式化类似于 yyyy-MM-ddTHH:mm:ssZ
的 date/time。
只有 POJO 中 ZonedDateTime
字段的 反序列化 我遇到了困难。
控制器
@RestController
public class MyController {
@GetMapping("/find")
public MyResponse find(MySearch search) {
// Do stuff ...
}
}
POJO
public class MySearch {
private Integer id;
private String name;
private ZonedDateTime dateTime;
}
配置
我使用这两个 bean 配置了 ObjectMapper
:
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return Jackson2ObjectMapperBuilder.json()
.modulesToInstall(new Jdk8Module(), new JavaTimeModule())
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.build();
}
我错过了什么或做错了什么?
谢谢!
如果你想反序列化这个对象,你需要将它注册为一个新的转换器。为此,您可以创建一个类似于此的 class:
@Configuration
public class ZoneDateTimeWebMvcConfigurator implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToZoneDateTime());
}
static class StringToZoneDateTime implements Converter<String, ZonedDateTime> {
@Override
public ZonedDateTime convert(String value) {
return ZonedDateTime.parse(value);
}
}
}