问题:Spring 似乎使用不同的反序列化方法LocalDate
取决于它是否出现在@RequestBody
或一个请求@ReqestParam
- 这是正确的吗?如果是,有没有办法将它们配置为在整个应用程序中相同?
背景:在我的@RestController
,我有两种方法——一种是GET,一种是POST。 GET 需要一个类型为的请求参数(“日期”)LocalDate
; POST 需要一个 JSON 对象,其中一个键(“日期”)的类型为LocalDate
。他们的签名类似于以下内容:
@RequestMapping(value = "/entity", method = RequestMethod.GET)
public EntityResponse get(
Principal principal,
@RequestParam(name = "date", required = false) LocalDate date)
@RequestMapping(value = "/entity", method = RequestMethod.POST)
public EntityResponse post(
Principal principal,
@RequestBody EntityPost entityPost)
public class EntityPost {
public LocalDate date;
}
我的 ObjectMapper 配置如下:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return objectMapper;
}
这确保系统接受LocalDate
以 yyyy-MM-dd 格式并按预期反序列化它 - 至少当它是@RequestBody
。因此,如果以下是 POST 的请求正文
{
"date": 2017-01-01
}
系统将请求体反序列化为EntityPost
正如预期的那样。
但是,该配置不适用于反序列化@RequestParam
。结果,这失败了:
// fail!
/entity?date=2017-01-01
相反,系统似乎需要 MM/dd/yy 格式。结果,成功了:
// success!
/entity?date=01/01/17
我知道我可以使用 @DateTimeFormat 注释逐个参数地更改它。我知道如果我按如下方式更改 GET 方法的签名,它将接受第一种格式:
@RequestMapping(value = "/entity", method = RequestMethod.GET)
public EntityResponse get(
Principal principal,
@RequestParam(name = "date", required = false) @DateTimeFormat(iso=DateTimeFormat.ISO.DATE) LocalDate date)
但是,如果我不必为每次使用添加注释,我会更喜欢LocalDate
。有什么办法可以全局设置这个,以便系统反序列化每个@RequestParam
类型的LocalDate
以同样的方式?
以供参考:
我正在使用春天4.3.2.发布
我正在使用杰克逊2.6.5