@XmlSeeAlso替代

我有以下内容:

class A{

@XmlElement

String name;

//getters and setters

}

class B extends A{

@XmlElement

String height;

//getters and setters

}

终于我有了

@XmlRootElement

class P{

@XmlElement

List<A> things;

//getters and setters

}

如果我做

List<A> l = new ArrayList<A>();

l.add(new B('hello', 20)) //Add new B with height of 20 and name hello

P p = new P();

p.setThings(l); //Set things to list of B's.

和P元帅,我只是把田野当作事物的一部分,而不是高度。

我知道我可以在A中添加@XmlSeeAlso(B.class),这一切都可以。

但是问题是我不知道B以外的所有扩展类,因为A可能在运行时扩展。

如何在运行时动态定义@XmlSeeAlso?

回答:

这取决于您如何创建JAXBContext。该newInstance方法可以与所有的类的显式列表被调用,该方法的文档也给出了类似的例子。

客户端应用程序必须提供新上下文对象需要识别的类的列表。新上下文不仅会识别所有指定的类,而且还将识别从指定类直接/间接静态引用的任何类。引用类的子类或@XmlTransient引用类的子类均未在JAXBContext中注册。例如,在以下Java代码中,如果执行newInstance(Foo.class),则新创建的JAXBContext将识别Foo和Bar,但不能识别Zot或FooBar:

class Foo {

@XmlTransient FooBar c;

Bar b;

}

class Bar { int x; }

class Zot extends Bar { int y; }

class FooBar { }

如果您至少知道潜在jaxb类的程序包名称,则还可以给定上下文路径来创建上下文。

如果上述方法不可行,您还可以在运行时根据要序列化的对象创建类列表。我认为最好尝试重构您的代码以使其不必要。以下代码未经测试:

Set<Class> classes = new HashSet<Class>();

classes.add(p.getClass());

for (A a : p.getThings()) {

classes.add(a.getClass());

}

JAXBContext context = JAXBContext.newInstance(classes.toArray(new Class[classes.size()]));

以上是 @XmlSeeAlso替代 的全部内容, 来源链接: utcz.com/qa/428862.html

回到顶部