Spring MVC:使用 Jackson objectMapper 将查询参数反序列化为 POJO

Mar*_*vic 1 spring-mvc deserialization spring-boot jackson2

Spring Web应用程序配置包含ObjectMapper像这样配置的Jackson

  objectMapper.disable(ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
  objectMapper.registerModule(new JavaTimeModule())
Run Code Online (Sandbox Code Playgroud)

JavaTimeModule添加来处理 的反序列化ZonedDateTime。有两个端点处理包含ZonedDateTime. POJO是这样的:

class MyRequest {
  ZonedDateTime from
  ZonedDateTime to
}
Run Code Online (Sandbox Code Playgroud)

具有端点的控制器是:

@Slf4j
@RestController
class MyController {

  @GetMapping('/pojo')
  void getPojo(MyRequest myRequest) {
    log.debug("Request received: $myRequest")
  }

  @PostMapping('/pojo')
  void postPojo(@RequestBody MyRequest myRequest) {
    log.debug("Request received: $myRequest")
  }
}
Run Code Online (Sandbox Code Playgroud)

当我发送带有正文的 POST /pojo 时

{"from": "2017-03-15T00:00:00Z", "to": "2017-03-16T00:00:00Z"}
Run Code Online (Sandbox Code Playgroud)

响应为200,反序列化成功。

相反,当我发送

GET /pojo?from=2017-03-15T00:00:00Z&to=2017-03-15T00:00:00Z
Run Code Online (Sandbox Code Playgroud)

收到 400 Bad Request 错误

Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime] for value '2017-03-15T00:00:00Z'
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为在 GET 请求中,我没有发送 JSON,因此不会调用 JSON 对象映射器。

有没有办法objectMapper也用于 GET 请求,以便将查询参​​数转换为 POJO 对象?

顺便说一句,我知道它可以像下面这样针对 GET 端点进行反序列化,但我想对 GET 和 POST 端点使用相同的转换器

@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime from
@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime to
Run Code Online (Sandbox Code Playgroud)

Mar*_*vic 6

将查询参数映射注入objectMapper并转换为对象解决了问题

@Slf4j
@RestController
class MyController {

  @Autowired
  private ObjectMapper objectMapper

  @GetMapping('/pojo')
  void getPojo(@RequestParam Map<String, String> allRequestParams) {
    MyRequest request = objectMapper.convertValue(allRequestParams, MyRequest)
    log.debug("Request received: $myRequest")
  }
...
Run Code Online (Sandbox Code Playgroud)