gpt4 book ai didi

java - JAXB:反序列化扩展类 A 的类 B 时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:40 26 4
gpt4 key购买 nike

请考虑以下示例:

有一个ClassA 和一个扩展它的ClassB。我现在的问题是我必须从 xml 文件中解码 ClassB。请注意 ClassA 无法更改,因为它不在我的控制之下。

这个例子中有几个问题:

主要问题是 ClassA 没有没有 Adapter 的 JAXB 所需的默认无参数构造函数。因此,我实现了 MyAdapter,它将 ClassB 映射到简单的类 ValB,JAXB 可以毫无问题地对其进行处理。

主要问题是如何让 JAXB 使用这个适配器?无论是在类级别上定义 @XmlJavaTypeAdapter 还是将适配器注册到解码器,都不会这样做。

有人知道如何让 JAXB 使用 MyAdapter 以便解码器返回一个对象,该对象是 ClassA 的实例吗?

public class JaxbTest {

public static abstract class ClassA {
public ClassA(String id) {
}
}

@XmlRootElement
@XmlJavaTypeAdapter(MyAdapter.class) // does not have an effect
public static class ClassB extends ClassA {

public String text;

public ClassB() {
super("");
}
}

public static class ValB {
public String text;
}

public static class MyAdapter extends XmlAdapter<ValB, ClassB> {

@Override
public ClassB unmarshal(ValB v) throws Exception {
ClassB b = new ClassB();
b.text = v.text;
return b;
}

@Override
public ValB marshal(ClassB v) throws Exception {
ValB b = new ValB();
b.text = v.text;
return b;
}

}

public static void main(String[] args) {
try {
JAXBContext context = JAXBContext.newInstance(ClassB.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setAdapter(new MyAdapter()); // does not have an effect
ClassA a = (ClassA) unmarshaller.unmarshal(new File("test.xml"));
// do somthing with a
} catch (Exception e) {
e.printStackTrace();
}
}
}

顺便说一句:不要把代码看得太认真——它只是一个演示问题的例子。我知道 ClassAClassB 的定义并不是很有用。

最佳答案

更新

我们已在即将发布的 EclipseLink JAXB (MOXy) 中解决了这个问题2.2.0 版本(参见 bug #332742)。在此版本中,将不会检查抽象类的无参数构造函数。

从 12 月 18 日开始,可以在此处获得带有此修复程序的预发布版本:

解决方法

这就是@XmlTransient 注释的用途。如果可能,请执行以下操作:

@XmlTransient
public static abstract class ClassA {
public ClassA(String id) {
}
}

如果无法直接注释 ClassA,您可以利用 EclipseLink JAXB (MOXy)扩展来做到这一点。 MOXy 允许您将 JAXB 元数据指定为 XML 文件。当您无法修改模型类时,这很有用:

下面是一些解释@XmlAdapter的文章:

关于java - JAXB:反序列化扩展类 A 的类 B 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4459737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com