Тип контента не поддерживается проблема - PullRequest
0 голосов
/ 05 апреля 2019

Когда я отправляю с Postman почтовый запрос с телом JSON (application/json), я получаю эту ошибку в spring-mvc (я не использую spring boot)

Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json' not supported

Я перепробовал всеТАК темы об этой ошибке, но ничего не работает: (

Я также включил зависимости для Jackson в моем pom.xml для сопоставления объектов JSON в POJO.

Так почему он продолжает говорить мнеContent type 'application/json' not supported!

Мой контроллер

@RestController
public class FooRest {
    // even with consumes=MediaType.APPLICATION_JSON_VALUE it does not work
    @RequestMapping(value = "/api/foo", method = RequestMethod.POST)
    public String foo(HttpServletRequest request, @RequestBody FooBean bean) {
        ...
    }
}

Мой конфиг

@Configuration
@EnableWebMvc
@ComponentScan({"controllers"})
public class AppConfig implements WebMvcConfigurer { }

Мой pom.xml

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${springframework.version}</version>
    </dependency>


    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

    ...

</dependencies>

версия скручивания

POST /MY-API HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 89859e26-813d-fb53-8726-57900f02207e

{ 
   //JSON OBJECT
}

РЕШЕНИЕ

Я изменил

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

На

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

И это работает наконец :) Может кто-нибудь объяснить мнепочему?

1 Ответ

1 голос
/ 05 апреля 2019

Кстати, @PostMapping - это специализированная версия аннотации @RequestMapping, которая действует как ярлык для @RequestMapping(method = RequestMethod.POST).

Без каких-либо изменений в конфигурации Spring (content-negotiation) методы, помеченные @PostMapping, потребляют и генерируют контент с типом носителя по умолчанию, т.е. application/json. Использование атрибутов consumes и produces для @PostMapping оправдано только в том случае, если вы хотите использовать и производить контент в другом типе носителя, т.е. application/xml.

Итак, следующий код должен подойти вам:

@RestController
public class FooRest {

    @PostMapping("/api/foo")
    public String foo(HttpServletRequest request, @RequestBody FooBean bean) {
        ...
    }
}

И, наконец, вам нужен заголовок accepts в запросе как application/json

Можете ли вы поделиться curl версией вашего запроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...