当前位置: 首页 > 知识库问答 >
问题:

如何处理Spring Boot Rest和Jackson反序列化器Javax验证中的无效数字

郏志学
2023-03-14

我有一个Java的Pojo类,它在我的Rest控制器中被期望作为一个@recestBody。这个JavaPojo类有一个整数字段。

当用户调用Rest API时,他们将整数字段值作为垃圾字符串传递,那么Jackson将抛出InvalidFormatExc0019。相反,我想使用Javax Validator框架注释来处理这个错误,并在响应中显示一个有意义的错误消息。不幸的是,Jackson从JSON反序列化到Java发生在Javax验证之前,因此我的@Digits验证从未被调用。

注意,@NotNull会被调用,但@Digits不会被调用,因为jackson在调用到达Javax验证层IMO之前很久就失败了请求

JavaPojo类:

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

您是否可以通过使用Javax验证注释来处理这个用例来帮助我解决这个问题?我认为在POJO类中将字段类型更改为字符串是一项昂贵的工作,因为每当我需要该字段的一些业务逻辑时,我们都必须进行字符串到整数的转换,因此这不是我的选择。

共有1个答案

赫连彬炳
2023-03-14

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

您是否可以通过使用Javax验证注释处理此用例来帮助我解决这种情况?

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

@Pattern(message = "quantity must be a number", regexp="^[0-9]*$")
private String quantity;
 类似资料:
  • 问题内容: 我有一个Vendor对象,可以从一个单独的“ vendor” json序列中反序列化,但是我想将此序列反序列化为一个,我只是想不出如何让Jackson合作。有小费吗? 问题答案: 您的数据存在问题,因为您的数组中有内部 包装 对象。想必你的对象被设计成手柄,,,但每次的多个对象也都包裹在一个对象与单一属性。 我假设您正在使用Jackson 数据绑定 模型。 如果是这样,那么有两件事要考

  • 问题内容: 我的问题很简单:我有以下简单的类: 我正在尝试处理以下JSON: 显然,这里存在一个问题(“ blah”无法解析为int) 以前,Jackson抛出类似org.codehaus.jackson.map.JsonMappingException的内容:无法从字符串值’blah’构造java.lang.Integer的实例:不是有效的Integer值 我同意这一点,但是我想在某个地方注册一

  • 问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因

  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器

  • 我正在尝试使用RestTemplate使用REST服务。我无法反序列化JSON响应。我正在使用一个自定义反序列化程序,我的JSON有3个节点,但看起来只有一个节点到达反序列化程序。以下是更多详细信息。 以下是JSON的响应: 我正在使用@jsondeselizer对属性Hello的响应类使用自定义反序列化器。 当我执行如下readTree时: 它到达了反序列化方法,看起来它只有一个节点,而不是下面

  • 在使用JSON库(如Jackson)反序列化时,如果JSON数据与目标类型不匹配,会抛出MismatchedInputException异常。 通过下面的代码可以复现问题。