java如何处理Spring Boot Rest和Jackson反序列化器的Javax验证中的无效数字
我有一个JavaPOJO类,它应该是Rest控制器中的@RequestBody
。这个JavaPOJO类有一个整数字段
当用户调用RESTAPI并将整型字段值作为垃圾字符串传递时,Jackson抛出InvalidFormatException
。相反,我想使用javaxvalidator框架注释来处理这个错误,并在响应中显示一条有意义的错误消息。不幸的是,Jackson从JSON到Java的反序列化发生在Javax验证之前,因此我的@Digits
验证从未被调用
注意,@NotNull会被调用,但@Digits不会被调用,因为jackson在调用到达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
但是没有用,因为Jackson在解析整型字段quantity
时反序列化失败
您是否可以通过使用Javax验证注释处理这个用例来帮助我解决这个问题?我认为在POJO类中将字段类型更改为字符串是一项昂贵的工作,因为每当我需要该字段上的一些业务逻辑时,我们都必须进行字符串到整数的转换,因此这不是我的选择
# 1 楼答案
在您的例子中,问题是您不符合REST API的要求,并且尝试发送一个字符串,而不是数量字段的数字。无论是您还是使用API的第三方服务,都不应该发生这种情况
在任何情况下,如果您仍然想要修复上述问题,解决方案是更改字符串类型字段中的“数量”,并为其添加模式匹配