Как обработать недопустимый номер в проверке Javax для Spring Boot Rest и десериализатора Джексона - PullRequest
0 голосов
/ 08 января 2020

У меня есть Java класс Pojo, который ожидается как @RequestBody в моем контроллере покоя. Этот Java класс Pojo имеет поле Integer.

Когда пользователь вызывает API Rest и передает значение поля Integer в виде строки нежелательной почты, Джексон выбрасывает InvalidFormatException. Вместо этого я хочу использовать аннотацию инфраструктуры Javax Validator для обработки этой ошибки и показа значимого сообщения об ошибке в ответ. К сожалению, десериализация Джексона с JSON до Java происходит до проверки Javax, поэтому моя проверка @Digits никогда не вызывается.

Обратите внимание, что @NotNull вызывается, но @Digits не вызывается, потому что Джексон не выполняет запрос задолго до того, как вызов достигнет уровня проверки Javax IMO.

Java Класс Pojo:

public class Board implements Serializable{
  private static final long serialVersionUID = 1L;


  @Digits(message = "quantity must be a number", integer = 8, fraction = 0)
  private Integer quantity;

  public Integer getQuantity() {
      return quantity;
  }

  public void setQuantity(Integer quantity) {
      this.quantity= quantity;
  }
}

Класс контроллера:

@Controller
@RequestMapping("boards")
public class EnrichController {

    @Autowired
    private BoardService boardService;

    @RequestMapping(value = "", method = RequestMethod.PUT, produces = "application/json;charset=UTF-8")
    public @ResponseStatus(value = HttpStatus.NO_CONTENT) @ResponseBody void updateBoard(
            @RequestBody @Valid Board board) throws IllegalArgumentException, MalformedURLException {
        boardService.updateUserBoard(board);
    }
}

Пользователь input:

{
  "quantity": "abcdef"
}

Как вы можете видеть, я использую аннотации проверки Javax @Digits & @Valid, но бесполезно, потому что десериализация Джексона завершается неудачно при разборе поля Integer quantity.

Можно ли как-нибудь помочь мне разрешить эту ситуацию, обработав этот вариант использования с помощью аннотаций проверки Javax? Я считаю, что изменение типа поля на String в классе POJO является дорогостоящим усилием, поскольку мы должны выполнять преобразование строки в целочисленное значение каждый раз, когда мне нужны бизнес-логики c в этом поле, поэтому для меня это не вариант.

1 Ответ

1 голос
/ 08 января 2020

Что ж, в вашем случае проблема в том, что вы не соответствуете стандарту REST API и пытаетесь отправить строку вместо числа для поля количества. Это никогда не должно происходить ни у вас, ни у сторонней службы, которая использует ваш API.

Есть ли какой-нибудь способ помочь мне решить эту ситуацию, обработав этот вариант использования с помощью аннотаций проверки Javax?

В любом случае, если вы все еще хотите исправить вышеприведенное, решение будет состоять в том, чтобы изменить «количество» в поле типа строки и добавить для него сопоставление с образцом

@Pattern(message = "quantity must be a number", regexp="^[0-9]*$")
private String quantity;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...