2017-03-16 1 views
1

configuration de l'application web Spring contient Jackson ObjectMapper configuré comme celui-ciSpring MVC: paramètres de requête Deserialise à POJO en utilisant Jackson objectMapper

objectMapper.disable(ADJUST_DATES_TO_CONTEXT_TIME_ZONE) 
    objectMapper.registerModule(new JavaTimeModule()) 

JavaTimeModule est ajouté à gérer désérialisation de ZonedDateTime. Il y a deux points d'extrémité qui traitent un POJO qui contient ZonedDateTime. Le POJO est comme ceci:

class MyRequest { 
    ZonedDateTime from 
    ZonedDateTime to 
} 

et contrôleur avec points d'extrémité est:

@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") 
    } 
} 

Lorsque j'envoie POST/POJO avec le corps

{"from": "2017-03-15T00:00:00Z", "to": "2017-03-16T00:00:00Z"} 

La réponse est 200 et désérialisation est couronnée de succès.

A l'inverse, quand j'envoie

GET /pojo?from=2017-03-15T00:00:00Z&to=2017-03-15T00:00:00Z 

Le 400 Bad Request est reçu avec erreur

Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime] for value '2017-03-15T00:00:00Z' 

Ce sens de faire, puisque dans la demande GET, je ne suis pas envoyer JSON et donc objet JSON Le mappeur n'est pas appelé.

Existe-t-il un moyen d'utiliser également objectMapper pour les requêtes GET, afin que les paramètres de requête soient convertis en objet POJO?

D'ailleurs, je sais qu'il peut être désérialisé pour point final GET comme ci-dessous, mais je veux utiliser le même convertisseur pour GET et point final POST

@DateTimeFormat(iso = ISO.DATE_TIME) 
ZonedDateTime from 
@DateTimeFormat(iso = ISO.DATE_TIME) 
ZonedDateTime to 

Répondre

1

Injecter objectMapper et la conversion des paramètres de requête carte en résoud objet le problème

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