Spring RequestBody с тестированием Почтальона - PullRequest
0 голосов
/ 05 июня 2018

Я тестирую свое приложение и обнаружил что-то странное.

Мой код:

  @RequestMapping(value = "/test/{subscriberId}", method = RequestMethod.PATCH, consumes = "application/json", produces = "application/json")
public void test(@PathVariable final String subscriberId,@RequestBody Boolean actDeact ) {
..
}

и когда я делаю запрос через почтальона, я получаю 400 плохих запросов: enter image description here

но когда я передаю только истинное в теле, все работает нормально: enter image description here

Я не могу понять, почему это происходит.

Я думал, что моя первая попытка была верной.То же самое происходит, если я жду строку (я не получаю код ошибки 400, но передаю мне все тело внутри строки)

Кто-нибудь может это объяснить?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Попробуйте так:

 public class MyPojo
    {
  private  Boolean actDeact;
  private  String subscriberId;
    // you can add it if you want more ..

    public Boolean getActDeact() {
        return actDeact;
    }

    public void setActDeact(Boolean actDeact) {
        this.actDeact = actDeact;
    }

   public String getSubscriberId() {
    return subscriberId;
   }
   public void setSubscriberId(String subscriberId) {
    this.subscriberId = subscriberId;
   } 
 }

@ RequestBody MyPojo myPojo // используйте его следующим образом.

Spring преобразует входящий JSON в объект MyPojo из тела сообщения (потому что выдобавила аннотацию @RequestBody), и она сериализовала возвращаемый объект в JSON (потому что вы добавили аннотацию @ResponseBody).

Подробнее см. https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc.

Примечание:

@ Аннотированные параметры RequestParam связываются с конкретными параметрами запроса сервлета.Значения параметров преобразуются в объявленный тип аргумента метода.Эта аннотация указывает, что параметр метода должен быть привязан к параметру веб-запроса.

@ RequestParam можно использовать, если вы хотите отправить: String, Boolean как параметр без оболочки.

Таким же образом

@ Параметры с аннотацией RequestBody связываются с телом HTTP-запроса.Значения параметров преобразуются в объявленный тип аргумента метода с помощью HttpMessageConverters.Эта аннотация указывает на то, что параметр метода должен быть привязан к телу веб-запроса.

Поэтому, когда вы отправляете истину, которая не является телом с методом.он не может работать или конвертироваться в json, поэтому он возвращает какой-то код состояния 400

Расширение кода ответа 400 Bad Request.Если вам все еще нужно знать больше об этом, вы можете прочитать документ пружин.Я надеюсь, что это поможет вам .... спасибо ..

0 голосов
/ 05 июня 2018

Десериализация логического значения - это просто логическое значение.Например: true

Если вы хотите принять параметр первым способом, вы должны принять этот параметр объектом dto.

Пример:

public class ActDeactDto {
    public boolean actDeact;
}

@RequestMapping(value = "/test/{subscriberId}", method = 
RequestMethod.PATCH, consumes = "application/json", produces = 
"application/json")
public void test(@PathVariable final String subscriberId, @RequestBody 
ActDeactDto actDeact ) {
..
}
...