У меня есть 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 в этом поле, поэтому для меня это не вариант.