Веб-перехватчик для сбора JSON: метод запроса POST не поддерживается

Я пишу контроллер с Java для URL-адреса веб-перехватчика, который получает вызов метода POST с телом JSON, которое мне нужно собрать.

Это упрощенная версия контроллера с аннотациями Spring:

@RestController
public class MyWebhoook {

    @PostMapping("/my-webhook")
    public void getMyJson(@RequestBody Map<String, Object> json) {
    System.out.println("WebHook collected JSON: " + json);
    }
}

Я тестирую его с помощью Postman, отправляющего этот JSON:

Header: Content-Type / application/json

{
    "webhookKey" : "tranviaVermellCostaAvall", 
    "token" : "xx",
    "channelId": 1,
    "propertyId": "999999",
    "status": "new",
    "reservationId": "111211221",
    "reservationStatus" : 1
}

И получаю такой ответ:

{
    "timestamp": "2019-04-09T07:23:38.093+0000",
    "status": 405,
    "error": "Method Not Allowed",
    "message": "Request method 'POST' not supported",
    "path": "/my-webhook"
}

Журнал сервера дает дополнительную информацию:

Request method 'POST' not supported, path=/my-webhook}] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@7756c3cd

Я пробовал эти разные подходы с тем же результатом:

  1. @RequestMapping(value = "/my-webhook", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST) вместо аннотации @PostMapping("/my-webhook").

  2. Моделирование полученного JSON как java-объекта вместо Map<String, Object> json.

  3. Использование HttpServletRequest вместо аннотации @RequestBody, попытка прочитать запрос как строку.

Я не понимаю, почему метод POST не разрешен. Любая помощь будет очень высоко ценится.

Попробуйте пометить свой метод @ResponseBody, см. stackoverflow.com/questions/12837907/…

vitalyster 09.04.2019 10:41

Ни одно из предложенных решений в указанном ответе StackOverflow не работает на моей стороне. Удивительно, но другие разработчики, копирующие мой код, заставляют его работать. Возможно, проблема связана с этим классом Джексона, который моя система принимает по умолчанию org.springframework.http.converter.json.MappingJackson2HttpM‌​essageConvert

Aleix Alcover 09.04.2019 13:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
2 110
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я добавил {} между вашим методом и получил 200 в качестве возврата. Я добавил изображения ниже, какой код, запрос и вывод консоли я получил.

Code and requestconsole

Я скопировал ваш код в свое весеннее загрузочное приложение, отлично работал через почтальона...

API:

@PostMapping("/my-webhook")
  public void getMyJson(@RequestBody Map<String, Object> json) {
  System.out.println("WebHook collected JSON: " + json);
}

Тело запроса:

{
    "webhookKey" : "tranviaVermellCostaAvall", 
    "token" : "xx",
    "channelId": 1,
    "propertyId": "999999",
    "status": "new",
    "reservationId": "111211221",
    "reservationStatus" : 1
}

URL-адрес: http://localhost:8080/мой-вебхук

Попробуй:

  • Обновите и очистите свой проект.
  • Сделайте недействительным кеш IDE, перезапустите его и повторите попытку.

Что-то может быть не так на моей стороне, потому что даже создание нового контроллера не работает. Возможно, вы используете альтернативу этому классу Джексона: org.springframework.http.converter.json.MappingJackson2HttpM‌​essageConvert, который получает мою систему по умолчанию из библиотеки Джексона в соответствии с моими настройками.

Aleix Alcover 09.04.2019 12:56
Ответ принят как подходящий

Проблема была с Конфигурация безопасности CSRF (подделка межсайтовых запросов). Путь веб-перехватчика должен быть выведен из-под контроля CSRF. В противном случае запрос POST не проходит контроль CSRF.

Это упрощенная выдержка из настроек безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http)throws Exception{
        http
            .csrf()
                 .ignoringAntMatchers("/my/webhook")

Другие вопросы по теме