2017-03-16 116 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") 
    } 
...