2016-09-16 1 views
1

J'essaie d'obtenir mes paramètres de requête dans un DTO like in this question mais mon DTO a toujours une valeur nulle.DTO n'a que null avec les paramètres de requête GET, mais pas POST @RequestBody

Y a-t-il quelque chose qui ne va pas dans mon code? Je l'ai fait aussi simple que possible.

Requêtes:

GET http://localhost:8080/api/test?a=azaz => null

POST http://localhost:8080/api/test avec {"a":"azaz"} => "Azaz"

Controller avec GET et POST:

@RestController 
@RequestMapping(path = {"/api"}, produces = APPLICATION_JSON_VALUE) 
public class MyController { 

    // GET: dto NOT populated from query params "?a=azaz" 
    @RequestMapping(method = GET, path = "test") 
    public @ResponseBody String test(TestDto testDto){ 
     return testDto.toString(); // null 
    } 

    // POST: dto WELL populated from body json {"a"="azaz"} 
    @RequestMapping(method = POST, path = "test") 
    public @ResponseBody String postTest(@RequestBody TestDto testDto){ 
     return testDto.toString(); // "azaz" 
    } 

} 

DTO:

public class TestDto { 
    public String a; 

    @Override 
    public String toString() { 
     return a; 
    } 
} 

Merci!

Full Spring boot sample to illustrate it

+0

Avez-vous un setter getter dans votre classe TestDto? Sinon, pouvez-vous ajouter getter et setter et vérifier? –

+0

vous ne dites pas à Spring que TestDto fait partie de la requête dans la requête get. – reos

Répondre

1

Le problème est que vous manque setter pour le champ.

public void setA(String a) { 
    this.a = a; 
} 

devrait le réparer.

+0

a créé un branche pour voir le correctif: https://github.com/pleymor/test-request-params-to-dto/tree/fix-request-params – Pleymor

0

Je suppose que vous avez fait la configuration requise comme ayant Jackson mappeur dans le chemin de la classe, attribut JSON consomment, getter et setter dans les classes DTO etc.

Une chose manquée est ici, en RequestMapping valeur attribut d'utilisation au lieu d'attribut path comme indiqué ci-dessous

@RequestMapping(method = POST, value= "/test", consumes="application/json") 
    public @ResponseBody String postTest(@RequestBody TestDto testDto){ 
     return testDto.toString(); 
    } 

Et, assurez-vous que vous définissez content-type = "application/json" lors de l'envoi de la demande

+0

Cette méthode (POST) fonctionne parfaitement. C'est l'autre (GET) qui ne remplit pas 'testDto' – Pleymor

+0

Dans la requête GET, vous ne pouvez pas passer la valeur json. Vous devez utiliser PathParameter ou RequestParameter –

+0

Je n'ai pas l'intention de passer une valeur json dans ma requête GET, mais j'essaye de faire comme ici: http://stackoverflow.com/questions/16942193/spring-mvc-complex- object-as-get-requestparam – Pleymor

0

Je pense que ce que vous essayez de faire n'est pas possible. Pour accéder à la requête Paramètre, vous devez utiliser @RequestParam ("a"). Ensuite, vous obtenez juste la chaîne. Pour obtenir votre objet de cette façon, vous devez transmettre json comme paramètre. a = { "a": "Azaz"}

Amitiés

+0

Selon cette question, il semble possible: http://stackoverflow.com/questions/16942193/spring-mvc-complex-object-as-get-requestparam – Pleymor