我有一个Java Pojo类,在我的Rest Controller中它应作为@RequestBody
。该Java Pojo类具有Integer字段。
[当用户调用Rest API时,他们将Integer字段值作为垃圾字符串传递,则Jackson抛出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);
}
}
用户输入:
{
"quantity": "abcdef"
}
您可以看到我正在使用Javax验证批注@Digits
和@Valid
,但没有用,因为在解析Integer字段quantity
时,杰克逊反序列化失败。
无论如何,您是否可以通过使用Javax验证批注处理此用例来帮助我解决这种情况?我认为在POJO类中将字段类型更改为String是一项昂贵的工作,因为每次我需要对该字段进行一些业务逻辑时,我们都必须进行String到Integer的转换,因此这对我来说不是一个选择。
我有一个Java Pojo类,在我的Rest Controller中它应该作为@RequestBody。该Java Pojo类具有Integer字段。当用户调用Rest API时,他们将Integer字段值传递为...
在您的情况下,问题是您不符合公开的REST API,并尝试为数量字段发送字符串而不是数字。您或使用您的API的第三方服务都永远不会发生这种情况。