Spring MVC:使用杰克逊objectMapper
问题描述:
Spring的web应用程序配置Deserialise查询参数POJO包含杰克逊ObjectMapper
配置这样Spring MVC:使用杰克逊objectMapper
objectMapper.disable(ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
objectMapper.registerModule(new JavaTimeModule())
JavaTimeModule
被添加到处理的ZonedDateTime
deserialisation。有两个端点处理包含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与身体
{"from": "2017-03-15T00:00:00Z", "to": "2017-03-16T00:00:00Z"}
的响应是200和deserialisation是成功的。
相反,当我送
GET /pojo?from=2017-03-15T00:00:00Z&to=2017-03-15T00:00:00Z
的400错误的请求是GET请求接收到错误
Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime] for value '2017-03-15T00:00:00Z'
这是有意义的,因为,我不发送JSON,因此JSON对象没有调用映射器。
还有一种方法可以使用objectMapper
进行GET请求,所以查询参数被转换为POJO对象吗?
顺便说一句,我知道它可以deserialised为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")
}
...