Spring MVC:使用 Jackson objectMapper 将查询参数反序列化为 POJO
Spring MVC: Deserialise query parameters to POJO using Jackson objectMapper
Spring Web 应用程序配置包含 Jackson ObjectMapper
配置如下
objectMapper.disable(ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
objectMapper.registerModule(new JavaTimeModule())
添加 JavaTimeModule
以处理 ZonedDateTime
的反序列化。有两个端点处理包含 ZonedDateTime
的 POJO。 POJO是这样的:
class MyRequest {
ZonedDateTime from
ZonedDateTime to
}
带有端点的控制器是:
@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")
}
}
当我发送 POST /pojo with body
{"from": "2017-03-15T00:00:00Z", "to": "2017-03-16T00:00:00Z"}
响应为200,反序列化成功
相反,当我发送
GET /pojo?from=2017-03-15T00:00:00Z&to=2017-03-15T00:00:00Z
收到错误的 400 Bad Request
Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime] for value '2017-03-15T00:00:00Z'
这是有道理的,因为在 GET 请求中,我没有发送 JSON,因此 JSON 对象映射器没有被调用。
有没有一种方法也可以将 objectMapper
用于 GET 请求,以便将查询参数转换为 POJO 对象?
顺便说一句,我知道它可以像下面这样针对 GET 端点进行反序列化,但我想对 GET 和 POST 端点
使用相同的转换器
@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime from
@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime to
注入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")
}
...
Spring Web 应用程序配置包含 Jackson ObjectMapper
配置如下
objectMapper.disable(ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
objectMapper.registerModule(new JavaTimeModule())
添加 JavaTimeModule
以处理 ZonedDateTime
的反序列化。有两个端点处理包含 ZonedDateTime
的 POJO。 POJO是这样的:
class MyRequest {
ZonedDateTime from
ZonedDateTime to
}
带有端点的控制器是:
@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")
}
}
当我发送 POST /pojo with body
{"from": "2017-03-15T00:00:00Z", "to": "2017-03-16T00:00:00Z"}
响应为200,反序列化成功
相反,当我发送
GET /pojo?from=2017-03-15T00:00:00Z&to=2017-03-15T00:00:00Z
收到错误的 400 Bad Request
Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime] for value '2017-03-15T00:00:00Z'
这是有道理的,因为在 GET 请求中,我没有发送 JSON,因此 JSON 对象映射器没有被调用。
有没有一种方法也可以将 objectMapper
用于 GET 请求,以便将查询参数转换为 POJO 对象?
顺便说一句,我知道它可以像下面这样针对 GET 端点进行反序列化,但我想对 GET 和 POST 端点
使用相同的转换器@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime from
@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime to
注入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")
}
...