не разрешать {} как тело запроса

#java #json #spring-boot #http-post #jackson-databind

#java #json #spring-boot #http-post #jackson-databind

Вопрос:

У меня есть следующий обработчик метода post:

 @PostMapping("/endpoint")
public int myEndpoint(@RequestBody MyBody body) {
    return body.foo;
}
  

Который принимает следующее тело запроса:

 class MyBody {
    private int foo;

    public MyBody() {}

    public MyBody(foo) {
        this.foo = foo;
    }

    public getFoo() {
        return this.foo;
    }
}
  

Теперь я ожидаю, что когда я отправлю запрос на /endpoint с телом {} , он вернет статус 400,

но я получаю 200, а body.foo равно 0.

Как я могу убедиться, что {} тело отклонено?

Комментарии:

1. Во-первых, измените ваши примитивные значения, такие как int на Integer . Во-вторых, вы можете использовать проверку, как сказал @Airy, или использовать Optional .

2. Почему понижающий голос?

Ответ №1:

Вы могли бы проверить тело с помощью аннотаций :

 @PostMapping("/endpoint")
public int myEndpoint(@RequestBody @Valid MyBody body) {
    return body.foo;
}
  

вам также необходимо добавить зависимость проверки

 <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-validation</artifactId> 
</dependency>
  

тогда MyBody это DTO, не используйте примитивные типы в качестве int, поскольку они имеют значение по умолчанию. Добавьте необходимые проверки :

 class MyBody {
    @NotNull
    private Integer foo;

    ...
}
  

Комментарии:

1. @NotNull Параметр перед body является повторным. Это ни на что не влияет, и @RequestBody по умолчанию требуется анонимизация = true.