如何在MOXy中使用已实例化的XmlAdapter,解决无零参构造报错问题
错误原因
MOXy 与原生 JAXB 行为存在差异:MOXy 在创建 JAXBContext 阶段就会尝试实例化所有 @XmlJavaTypeAdapter 注解指定的适配器类,要求类必须提供无参构造;而原生 JAXB 仅在实际序列化/反序列化阶段才会尝试实例化适配器,若你手动调用 setAdapter 传入已实例化的对象,就不会触发默认实例化逻辑,因此原生实现不会报错。
解决方案
方案1:创建JAXBContext时传入已实例化的XmlAdapter(推荐)
无需修改现有注解,也不需要调整适配器类结构,仅需在调用 JAXBContextFactory.createContext 时通过属性传入你已经实例化好的适配器即可:
// 提前实例化自定义的XmlAdapter XmlAdapter customAdapter = new Something.JaxbAdapter(this, ...); // 构造属性Map Map<String, Object> contextProperties = new HashMap<>(); contextProperties.put(org.eclipse.persistence.jaxb.JAXBContextProperties.XML_JAVA_TYPE_ADAPTER, customAdapter); // 创建JAXBContext时传入属性 this.jaxbContext = org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(classes.toArray(new Class[0]), contextProperties);
如果有多个自定义适配器需要传入,将传入值替换为多个适配器组成的数组即可。如果后续需要覆盖适配器实例,依然可以在 Unmarshaller/Marshaller 上调用 setAdapter 方法修改,不会产生冲突。
方案2:调整适配器与注解实现
如果你的适配器不需要依赖外部参数初始化,可以通过简单调整适配MOXy逻辑:
- 给
Something.JaxbAdapter类添加 public 无参构造方法 - 保留类上的
@XmlJavaTypeAdapter(Something.JaxbAdapter.class)注解即可正常创建JAXBContext
提示
如果你的 JaxbAdapter 是内部非静态类,优先选择方案1,无需修改类结构即可解决问题。
内容的提问来源于stack exchange,提问作者user212942
相关产品推荐
相关产品推荐

