web-dev-qa-db-fra.com

Publication JSON sur Spring Controller

Bonjour, je commence avec les services Web au printemps. Je tente donc de développer une petite application sous Spring + JSON + Hibernate. J'ai un problème avec HTTP-POST. J'ai créé une méthode:

@RequestMapping(value="/workers/addNewWorker", method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
@ResponseBody
public String addNewWorker(@RequestBody Test test) throws Exception {
    String name = test.name;
    return name;
}

Et mon modèle Test ressemble à:

public class Test implements Serializable {

private static final long serialVersionUID = -1764970284520387975L;
public String name;

public Test() {
}
}

Par POSTMAN, j’envoie simplement JSON {"name": "testName"} et je reçois toujours une erreur;

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

J'ai importé la bibliothèque de Jackson. Mes méthodes GET fonctionnent bien. Je ne sais pas ce que je fais mal. Je suis reconnaissant pour toute suggestion.

11
user2239655

Convertissez votre objet JSON en chaîne JSON à l'aide de 

JSON.stringify ({"name": "testName"})  

ou manuellement. @RequestBody attend une chaîne json au lieu d'un objet json.

Remarque: la fonction stringify ayant un problème avec certaines versions IE, firefox cela fonctionnera

vérifiez la syntaxe de votre demande ajax pour la demande POST. processData: false la propriété est requise dans la requête ajax

$.ajax({ 
    url:urlName,
    type:"POST", 
    contentType: "application/json; charset=utf-8",
    data: jsonString, //Stringified Json Object
    async: false,    //Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation
    cache: false,    //This will force requested pages not to be cached by the browser  
     processData:false, //To avoid making query String instead of JSON
     success: function(resposeJsonObject){
        // Success Action
    }
});

Manette

@RequestMapping(value = urlPattern , method = RequestMethod.POST)

public @ResponseBody Test addNewWorker(@RequestBody Test jsonString) {

    //do business logic
    return test;
}

@RequestBody -Covert Json object to Java

@ResponseBody - convertit un objet Java en json

23
Vineeth Bhaskaran

Essayez d'utiliser application/* à la place. Et utilisez JSON.maybeJson () pour vérifier la structure de données dans le contrôleur.

0
Vin Tsie

Vous devez inclure les getters et les setters pour tous les champs définis dans le modèle Test

public class Test implements Serializable {

    private static final long serialVersionUID = -1764970284520387975L;

    public String name;

    public Test() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
0
Ameya Pandilwar

Procédez comme suit si vous souhaitez utiliser JSON en tant que requête et réponse http. Nous devons donc apporter des modifications dans [context] .xml

<!-- Configure to plugin JSON as request and response in method handler -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <beans:property name="messageConverters">
        <beans:list>
            <beans:ref bean="jsonMessageConverter"/>
        </beans:list>
    </beans:property>
</beans:bean>
<!-- Configure bean to convert JSON to POJO and vice versa -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>   

MappingJackson2HttpMessageConverter sur le messageConverters RequestMappingHandlerAdapter afin que l'API Jackson déclenche et convertisse le JSON en Java Beans et inversement. Avec cette configuration, nous utiliserons JSON dans le corps de la requête et nous recevrons des données JSON dans la réponse.

Je fournis également un petit extrait de code pour la partie contrôleur:

    @RequestMapping(value = EmpRestURIConstants.DUMMY_EMP, method = RequestMethod.GET)

    public @ResponseBody Employee getDummyEmployee() {
    logger.info("Start getDummyEmployee");
    Employee emp = new Employee();
    emp.setId(9999);
    emp.setName("Dummy");
    emp.setCreatedDate(new Date());
    empData.put(9999, emp);
    return emp;
}

Donc, dans le code ci-dessus, l'objet emp convertira directement en json en réponse. il en sera de même pour le poste également. 

0
Aman Goel