有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在您的例子中,问题是您不符合REST API的要求,并且尝试发送一个字符串,而不是数量字段的数字。无论是您还是使用API的第三方服务,都不应该发生这种情况

    Is there anyway you can help me to solve this situation by handling this use-case using Javax validation annotations?

    在任何情况下,如果您仍然想要修复上述问题,解决方案是更改字符串类型字段中的“数量”,并为其添加模式匹配

    @Pattern(message = "quantity must be a number", regexp="^[0-9]*$")
    private String quantity;