@MockingAlchemist

Как сделать DTO с валидацией данных в Java Spring?

В общем, я руководствовался этой статьей - https://habr.com/ru/post/343960/ и еще несколькими другими, но валидация так и не срабатывает.

Вот что я сделал:
1. Контроллер
import ideaweb.sunny.web.DTO.ProxyDto;
import org.springframework.http.MediaType;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
public class MainController
{
    @PostMapping("/proxy/add")
    public void saveProxy(@Valid @RequestBody ProxyDto dto) {

        System.out.println(dto.toString());

    }
}


2. DTO:
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;


public class ProxyDto {

    @NotNull(message = "123")
    @NotEmpty(message = "456")
    private String proxy;
    
}


Но если я посылаю запрос (json), в котором поле proxy отсутствует, то получаю ответ 200, и в консоль печатаются эти объекты как ни в чём не бывало.
Пожалуйста, подскажите, где я ошибаюсь.

Запрос посылаю следующим образом:
curl -v -X POST localhost:8081/proxy/add -H "Content-type:application
/json" -d "{\"proxy\":\"127.0.0.1\"}"

и ожидаю увидеть статус 400 в ответ на это:
curl -v -X POST localhost:8081/proxy/add -H "Content-type:application
/json" -d "{\"somethingElse\":\"127.0.0.1\"}"
  • Вопрос задан
  • 394 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Похоже, что у вас в зависимостях нет библиотек валидатора, соответственно Boot валидацию не включает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Здравствуйте!
Если честно, то меня сама строка настораживает
@NotNull(message = "123")
    @NotEmpty(message = "456")
    private String proxy;

NotEmpty и так проверяет строку на NULL и на пустоту и соответственно, аннотация @NotNull не нужна.
Попробуйте удалить эту аннотацию и проверьте заново.
Ответ написан
у вас импорт неправильный был вместо
import javax.validation.Valid;
@RestController
public class MainController
{
    @PostMapping("/proxy/add")
    public void saveProxy(@Valid @RequestBody ProxyDto dto) {

надо

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
@RestController
@RequestMapping("/proxy")

public class MainController
{
	@RequestMapping(value = "add", method = RequestMethod.POST)
	public Map<String, Object> addBook(@Validated @RequestBody ProxyDto dto ) {
....
и
import javax.validation.constraints.NotNull;
public class ProxyDto {

	@NotNull(message = "idbn is missing")
	@NotEmpty(message = "idbn is empty")


 private String proxy;


в зависимости от версии фрамеворка скажкт типа

{
  "timestamp": 1612029070201,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.web.bind.MethodArgumentNotValidException",
  "errors": [
    {
      "codes": [
        "NotNull.book.isbn",
        "NotNull.isbn",
        "NotNull.java.lang.String",
        "NotNull"
      ],
      "arguments": [
        {
          "codes": [
            "book.isbn",
            "isbn"
          ],
          "arguments": null,
          "defaultMessage": "isbn",
          "code": "isbn"
        }
      ],
      "defaultMessage": "idbn is missing",
      "objectName": "book",
      "field": "isbn",
      "rejectedValue": null,
      "bindingFailure": false,
      "code": "NotNull"
    },
    {
      "codes": [
        "NotEmpty.book.isbn",
        "NotEmpty.isbn",
        "NotEmpty.java.lang.String",
        "NotEmpty"
      ],
      "arguments": [
        {
          "codes": [
            "book.isbn",
            "isbn"
          ],
          "arguments": null,
          "defaultMessage": "isbn",
          "code": "isbn"
        }
      ],
      "defaultMessage": "idbn is empty",
      "objectName": "book",
      "field": "isbn",
      "rejectedValue": null,
      "bindingFailure": false,
      "code": "NotEmpty"
    }
  ],
  "message": "Validation failed for object='book'. Error count: 2",
  "path": "/book/add"
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы