如何在Spring Boot Rest和Jackson Deserializer的Javax验证中处理无效数字

问题描述 投票:0回答:1

我有一个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字段值传递为...

java spring-boot validation jackson spring-restcontroller
1个回答
1
投票

在您的情况下,问题是您不符合公开的REST API,并尝试为数量字段发送字符串而不是数字。您或使用您的API的第三方服务都永远不会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.