当前位置: 首页 > 面试题库 >

@XmlSeeAlso替代

洪知
2023-03-14
问题内容

我有以下内容:

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()]));


 类似资料:
  • 问题内容: 我正在尝试映射一个具有一些JAXB元素(如@ XmlSeeAlso,@ XmlElement,@ XmlSchemaType)作为该类属性的bean。 现在,当使用mapStruct映射时,我面临以下问题。 Bean PersonalCustomer没有被映射。我没有在回复中看到它。但是在使用推土机时它可以完美地工作。我需要做的就是在dozer config xml中的映射中定义它。我

  • 问题内容: 这是一个从来没有一个正确答案的问题,我已经在网上搜索了很多次,却找不到解决方案。 它适用于Firefox,Chrome。我的responseText将像Réunion这样返回char,它将显示为奇怪的符号。 我尝试了许多方法,例如编码和解码,在响应文件中设置标头都无效。我没主意了。请帮助某人。 在主文件中,确保设置了内容类型和字符集。 在您的AJAX加载页面中,确保您位于顶部。 问题解

  • 问题内容: 我想为re.sub提供替代的替换模式。 假设我有两种搜索模式可供选择,如下所示: 而不是提供一个替换模式,我想以某种方式捕获匹配哪个搜索模式的替换项并提供替换模式。这可能吗?谢谢。 PS。这里的代码细节无关紧要,这是一个普遍的问题。 问题答案: 您可以将函数传递给。在该函数中,您可以根据捕获的组返回所需的值。一个简单的代码说明: 该函数检查匹配是否成功,并根据捕获的组返回替换字符串。如

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认

  • 问题内容: 首先-我的描述;) 我从服务器收到XmlHttpRequests JSON响应。MySQL驱动程序将所有数据输出为字符串,PHP将其按原样返回,因此任何整数都将作为字符串返回,因此: JS中的parseInt()函数是否有任何快速替代方法(hack),可以解析纯数字字符串,例如 问题答案: 要转换为整数,只需使用一元+运算符,它应该是最快的方法: 可以通过类似的方式转换为其他类型: 更

  • 问题内容: 在一个Web项目中,用户上传了他们的文件,但是当我在服务器上收到它们时,它们将被存储为.tmp文件而不是原始文件扩展名(这也是我的首选行为)。 但是,这引起了问题。虽然对我来说本地的,但是在我的Linux开发机器上,它可以正常工作并且可以确定正确的mime类型,但是当我将项目上传到生产服务器(amazon beantalk)时,似乎无法正确确定mime类型。 从阅读javadocs来看