web-dev-qa-db-fra.com

Le contenu du corps de la requête requis est manquant: org.springframework.web.method.HandlerMethod $ HandlerMethodParameter

Erreur de transmission des données JSON de JSP au contrôleur dans ResponseBody.

07:13:53.919 DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolving exception from handler [public com.chaitanya.ajax.AjaxResponse com.chaitanya.web.controller.DepartmentController.addDepartment(com.chaitanya.ajax.AjaxResponse)]: 

org.springframework.http.converter.HttpMessageNotReadableException: Required request body content is missing: org.springframework.web.method.HandlerMethod$HandlerMethodParameter@98d8d36c
07:13:54.106 DEBUG o.s.w.s.m.a.ResponseStatusExceptionResolver - Resolving exception from handler [public com.chaitanya.ajax.AjaxResponse com.chaitanya.web.controller.DepartmentController.addDepartment(com.chaitanya.ajax.AjaxResponse)]: org.springframework.http.converter.HttpMessageNotReadableException: Required request body content is missing: org.springframework.web.method.HandlerMethod$HandlerMethodParameter@98d8d36c
07:13:54.125 DEBUG o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolving exception from handler [public com.chaitanya.ajax.AjaxResponse com.chaitanya.web.controller.DepartmentController.addDepartment(com.chaitanya.ajax.AjaxResponse)]: org.springframework.http.converter.HttpMessageNotReadableException: Required request body content is missing: org.springframework.web.method.HandlerMethod$HandlerMethodParameter@98d8d36c
07:1

Appel Ajax:

$.ajax({ 
                        url: "/BusinessReimbursment/addDepartment", 
                        method: 'POST', 
                        dataType: 'json', 
                        data: "{\"message\":\"abc\",\"success\":true}",
                        contentType: 'application/json',
                        mimeType: 'application/json',
                        success: function(data) { 
                            alert(data.id + " " + data.name);
                            commit(true);
                        },
                        error:function(data,status,er) { 
                            alert("error: "+data+" status: "+status+" er:"+er);
                        }
                    });

Manette:

@RestController
public class DepartmentController {

    @Autowired 
    @Qualifier("departmentService")
    private DepartmentService departmentService;

    @RequestMapping(value="/addDepartment", method={RequestMethod.POST})
    public @ResponseBody AjaxResponse addDepartment(@RequestBody AjaxResponse  departmentDTO){
        AjaxResponse response=new AjaxResponse();
        return response;
    }

AppConfig.Java

@Haricot

public RequestMappingHandlerAdapter  annotationMethodHandlerAdapter()
{
    final RequestMappingHandlerAdapter annotationMethodHandlerAdapter = new RequestMappingHandlerAdapter();
    final MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJackson2HttpMessageConverter();

    List<HttpMessageConverter<?>> httpMessageConverter = new ArrayList<HttpMessageConverter<?>>();
    httpMessageConverter.add(mappingJacksonHttpMessageConverter);

    String[] supportedHttpMethods = { "POST", "GET", "HEAD" };

    annotationMethodHandlerAdapter.setMessageConverters(httpMessageConverter);
    annotationMethodHandlerAdapter.setSupportedMethods(supportedHttpMethods);

    return annotationMethodHandlerAdapter;
}

aidez-moi s'il vous plaît à sortir de cela. J'utilise Spring 4, jakson 2.3.0

Si j'essaie de POST demander, cela donne: org.springframework.web.HttpRequestMethodNotSupportedException: La méthode de requête 'POST' n'est pas supportée

19
chaitanya dalvi

Désolé les gars .. en fait, à cause d'un jeton Csrf, j'avais ce problème. J'ai mis en place la sécurité de printemps et csrf est activé. Et par appel ajax, je dois passer le jeton csrf.

1
chaitanya dalvi

Vous ne devez pas envoyer de corps de requête avec une requête HTTP GET. Vous devez modifier addDepartment() pour qu'il ne prenne en charge que POST, et POST votre JSON à ce noeud final. Si vous souhaitez obtenir des informations sur un service, vous devez créer un contrôleur distinct méthode qui le fait (et ne nécessite pas de corps de requête).

Vérifiez également les définitions de vos points finaux, car vous avez mal orthographié "remboursement" dans le fichier $.ajax appel.

28
ach

J'ai aussi eu le même problème. J'utilise "Postman" pour la demande JSON. Le code lui-même n'est pas faux. Je règle simplement le type de contenu sur JSON (application/json) et cela a fonctionné, comme vous pouvez le voir sur l'image ci-dessous

My Code

6
Rujal Shrestha

Essaye ça:

@RequestBody (required = false) String str

2
Juan

J'ai apporté quelques modifications mineures à votre code et l'ai testé avec un projet Spring que j'ai et cela fonctionne. La logique fonctionnera uniquement avec POST si j'utilise GET, une erreur avec une requête non valide est générée. De plus, dans votre appel ajax, j'ai commenté commit (true), le débogueur du navigateur signalé et une erreur indiquant qu'il n'était pas défini. Modifiez simplement l'URL pour l'adapter à l'architecture de votre projet Spring.

 $.ajax({ 
                    url: "/addDepartment", 
                    method: 'POST', 
                    dataType: 'json', 
                    data: "{\"message\":\"abc\",\"success\":true}",
                    contentType: 'application/json',
                    mimeType: 'application/json',
                    success: function(data) { 
                        alert(data.success + " " + data.message);
                        //commit(true);
                    },
                    error:function(data,status,er) { 
                        alert("error: "+data+" status: "+status+" er:"+er);
                    }
                });



@RequestMapping(value="/addDepartment", method=RequestMethod.POST)
  public AjaxResponse addDepartment(@RequestBody final AjaxResponse  departmentDTO)
  {
    System.out.println("addDepartment: >>>>>>> "+departmentDTO);
    AjaxResponse response=new AjaxResponse();
    response.setSuccess(departmentDTO.isSuccess());
    response.setMessage(departmentDTO.getMessage());
    return response;
  }
2
faljbour