Запрос PUT: отсутствует требуемый текст запроса

Учитывая это приложение Spring Boot:

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

}

И этот запрос на скручивание:

curl -X PUT -H "Content-Type: application/x-www-form-urlencoded" --data "arg1=val&arg2=val" http://localhost:8080/submit

В Spring Boot 1.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>)

Что нужно в Spring Boot 1.3.8, чтобы этот запрос PUT снова заработал?


person Roland Weisleder    schedule 26.01.2017    source источник


Ответы (1)


Добавьте аннотацию @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(",")));
    }

}
person Alessandro Moraes    schedule 26.01.2017
comment
Оно работает. Есть ли причина, по которой эта аннотация требуется сейчас или что она меняет? - person Roland Weisleder; 26.01.2017
comment
Из документации по весенней загрузке: Normally you would add @EnableWebMvc for a Spring MVC app, but Spring Boot adds it automatically when it sees spring-webmvc on the classpath. This flags the application as a web application and activates key behaviors such as setting up a DispatcherServlet.[spring.io/guides/gs/ spring-boot/](источник) - person oruckdeschel; 26.01.2017
comment
Я думаю, что они удалили его, потому что будут использовать эту аннотацию только тогда, когда вы хотите полностью контролировать свою конфигурацию mvc, избегая некоторых поведений по умолчанию, настроенных весенней загрузкой. - person Alessandro Moraes; 26.01.2017