Java PUT请求:缺少必需的请求正文

Java PUT请求:缺少必需的请求正文,java,spring,spring-boot,spring-web,Java,Spring,Spring Boot,Spring Web,给定此Spring引导应用程序: @SpringBootApplication @RestController public class ShowCase { public static void main(String[] args) { SpringApplication.run(ShowCase.class, args); } @RequestMapping(value = "submit", method = RequestMethod.PUT

给定此Spring引导应用程序:

@SpringBootApplication
@RestController
public class ShowCase {

    public static void main(String[] args) {
        SpringApplication.run(ShowCase.class, args);
    }

    @RequestMapping(value = "submit", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void getFormKeys(@RequestBody MultiValueMap<String, String> formData) {
        System.out.println(formData.keySet().stream().collect(joining(",")));
    }

}
使用SpringBoot1.2.5,可以正确调用该方法并打印表单键

Spring Boot 1.3.8不会调用该方法,但会记录一条警告:

WARN 17844 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public void web.ShowCase.getFormKeys(org.springframework.util.MultiValueMap<java.lang.String, java.lang.String>)
WARN 17844---[nio-8080-exec-1].w.s.m.s.DefaultHandlerExceptionResolver:无法读取HTTP消息:org.springframework.HTTP.converter.httpMessageNodeEnableException:缺少必需的请求正文:public void web.ShowCase.getFormKeys(org.springframework.util.MultiValueMap)

Spring Boot 1.3.8中需要什么才能使该PUT请求再次工作?

添加@EnableWebMvc注释:

@SpringBootApplication
@RestController
@EnableWebMvc
public class ShowCase {

    public static void main(String[] args) {
        SpringApplication.run(ShowCase.class, args);
    }

    @RequestMapping(value = "submit", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void getFormKeys(@RequestBody MultiValueMap<String, Object> formData) {
        System.out.println(formData.keySet().stream().collect(Collectors.joining(",")));
    }

}
@springboot应用程序
@RestController
@EnableWebMvc
公开课展示{
公共静态void main(字符串[]args){
SpringApplication.run(ShowCase.class,args);
}
@RequestMapping(value=“submit”,method=RequestMethod.PUT,consumes=MediaType.APPLICATION\u FORM\u URLENCODED\u value)
public void getFormKeys(@RequestBody MultiValueMap formData){
System.out.println(formData.keySet().stream().collect(collector.joining(“,”));
}
}

它可以工作。现在需要此注释的原因是什么?或者它的变化是什么?从spring boot文档:
通常您会为spring MVC应用程序添加@EnableWebMvc,但spring boot在类路径上看到spring webmvc时会自动添加它。这将应用程序标记为web应用程序,并激活关键行为,例如设置DispatcherServlet。
[我认为他们删除了它,因为只有在您希望完全控制mvc配置时才会使用此注释,从而避免spring boot配置的一些默认行为。
@SpringBootApplication
@RestController
@EnableWebMvc
public class ShowCase {

    public static void main(String[] args) {
        SpringApplication.run(ShowCase.class, args);
    }

    @RequestMapping(value = "submit", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void getFormKeys(@RequestBody MultiValueMap<String, Object> formData) {
        System.out.println(formData.keySet().stream().collect(Collectors.joining(",")));
    }

}