有 Java 编程相关的问题?

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

java Jackson如何在没有已知属性的情况下失败,这与反序列化功能不同。在未知属性上失败

我们使用Jackson XmlMapper和ObjectMapper将XML和JSON文件解析为Java中的对象模型

问题是,我们还使用它们来验证(通过捕捉xmlMapper.readValue(file, type)返回IOExeception),给定要解析的文件是否与模型匹配(只要所需的模型字段存在,我们就不关心未知属性——只要整个对象的所有属性都不会返回null)

因此,使用xmlMapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)对我们来说并不太有效,因为如果存在我们不想映射的未知属性(或不知道的属性,或它们并不总是出现),映射就会失败

然而,我们仍然希望映射失败,如果我们要映射到的对象变为null(例如:提供给映射的xml文件与正确的结构完全不同——例如:它以根元素开头,而我们要映射到的模型以元素开头,xml中的任何地方都没有“页面”)

模型的主类注释为: @JacksonXmlRootElement(localName = "ResultsSession"),我们需要的所有属性都被注释为@JacksonXmlProperty(localName = "someValue")(isAttribute = true)

这有意义吗? 有没有办法确保映射的对象包含根元素,而不强制执行失败或未知属性


共 (1) 个答案

  1. # 1 楼答案

    我找到了一个可行的解决方案。 正确的方法是通过Java Bean Validator,大致如下:

    ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
    Validator validator = validatorFactory.getValidator();
    Set<ConstraintViolation<Object> violations = validator.validate(mappedObject);
    if (violations.size > 0 ) {
      for (ConstraintViolation<Object> violation : violations( {
        LOGGER.error(violation.getMessage());
      }
    }
    

    而被验证的对象会向一个键属性添加类似:@NotNull(Message = "error message")的内容,这将很好地工作

    参考:https://www.baeldung.com/javax-validation