【问题标题】:Jackson completely ignore Jaxb XML related annotationsJackson 完全忽略 Jaxb XML 相关的注解
【发布时间】:2020-12-09 17:33:10
【问题描述】:

想象一下,当您有一个 Java 模型时,您必须将它序列化为 XML 和 CSV。

我将 Jaxb Marshaller 用于 XML,将 Jackson 的 CsvMapper (ObjectMapper) 用于 CSV。

由于格式略有不同,我希望 Jackson 的 CsvMapper 忽略 Jaxb 相关的注释,如 @XmlType@XmlElement。因为 Jackson 也在获取信息/考虑 xml 注释,这会导致错误的结果。

我该怎么做?

【问题讨论】:

  • 如何创建CsvMapper 实例? Jackson 默认不识别 JaxB 注释。要识别它们 Jackson 需要 jackson-module-jaxb-annotations 模块。
  • 不,Jackson 默认会识别Jaxb 注解,其中一些注解的优先级高于自己的注解
  • 您是否使用JacksonSpring Boot 或类似的可以自动注册JAXB 模块的东西?你如何创建CsvMapper 对象?您能否创建一个可以重现此错误的简单示例?
  • csvMapper.findAndRegisterModules(); - 此行尝试注册类路径上可用的模块。您可以删除它,JAXB 模块将被忽略。仅手动注册您需要的此模块。
  • 你是对的!你应该把它作为答案!谢谢!

标签: java serialization jackson annotations jaxb


【解决方案1】:

这就是您可能创建新CsvMapper 的方式:

CsvMapper csvMapper = new CsvMapper();
csvMapper.findAndRegisterModules();

findAndRegisterModules 方法调用 findModules,文档中说:

使用 JDK ServiceLoader 工具以及模块提供的 SPI 来定位可用方法的方法。

所以,您可能在类路径上有 jackson-module-jaxb-annotations 模块,这就是为什么 CsvMapper 可以识别 JAXB 注释。

要修复它,您需要删除此方法findAndRegisterModules 的调用并仅注册您需要的这些模块。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 2019-11-25
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多