2017-03-16 111 views
1

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 

回答

1

注射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") 
    } 
...