微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

杰克逊如何无法获得未知属性-与DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES不同

如何解决杰克逊如何无法获得未知属性-与DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES不同

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

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

因此,使用xmlMapper.enable(DeserializationFeature.FAIL_ON_UNKNowN_PROPERTIES)对我们而言并不可行,因为如果存在我们不希望映射(或知道,或者他们不愿意映射)的 unkNown 属性,则映射将失败。总是会出现)。

但是,如果我们要映射到的对象变为null(例如:给map的xml文件根本不喜欢正确的结构,例如,它以root开头),我们仍然希望映射失败。元素,而我们要映射到的模型则以元素开始,并且在XML中的任何地方都没有“页面”。

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

这有意义吗? 有没有一种方法可以确保映射的对象包含根元素,而不会强制失败或未知属性

解决方法

我找到了一个行之有效的解决方案。 正确的方法是通过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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。