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

JAXBContext.newInstance的变体

闻人昕
2023-03-14
问题内容

我正在类 JAXBContext中* 尝试各种形式的 newInstance 方法(我正在使用Oracle JDK 1.7附带的默认Sun
JAXB实现)。
*

我不清楚何时可以将具体类与 ObjectFactory* 类传递给 newInstance
方法。我应该注意,我纯粹是在解析XML文件时使用JAXB,即仅在XML-> Java方向上使用。
*

这是证明我的观点的绝对最少的代码:

XSD文件

<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
    xmlns          ="http://www.w3.org/2001/XMLSchema"
    xmlns:a        ="http://www.example.org/A"
    targetNamespace="http://www.example.org/A">
    <element name="root" type="a:RootType"></element>

    <complexType name="RootType">
       <sequence>
           <element name="value" type="string"></element>
       </sequence>
    </complexType>
</schema>

在上述XSD的情况下,以下 JAXBInstance.newInstance 调用成功创建了可以解析样本 a.xml 文件的上下文:

  • jc = JAXBContext.newInstance(“ example.a”);
  • jc = JAXBContext.newInstance(example.a.ObjectFactory.class);
  • jc = JAXBContext.newInstance(example.a.RootType.class,example.a.ObjectFactory.class);

但是,仅在运行时传递 example.a.RootType.class 失败,并出现
javax.xml.bind.UnmarshalException

jc = JAXBContext.newInstance(example.a.RootType.class); // this fails at runtime.

谁能给我一些启示?我在这些 JAXBContext :: newInstance
变体上进行实验的原因是,我偶然发现了这个问题,在这个问题上,可接受的答案包括“基于单个类而不是对象工厂构建JAXB上下文”的选项。我在 后面 使用了示例
a.xml 和我正在使用的 JAXB Java代码。

<?xml version="1.0" encoding="UTF-8"?>
<a:root xmlns:a="http://www.example.org/A"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.example.org/A A.xsd">
    <a:value>foo</a:value>
</a:root>

JAXB解析代码

public static void main (String args[]) throws JAXBException, FileNotFoundException {
    JAXBContext jc = null;
    message("using package context (press any key:)");
    jc = JAXBContext.newInstance("example.a");
    work(jc); // SUCCEEDS

    message("using Object factory (press any key):");
    jc = JAXBContext.newInstance(example.a.ObjectFactory.class);
    work(jc); // SUCCEEDS

    message("using class enumeration (press any key):");
    try {
        jc = JAXBContext.newInstance(example.a.RootType.class);
        work(jc);  // FAILS
    } catch (javax.xml.bind.UnmarshalException e) {
        e.printStackTrace();
    }

    message("using class enumeration and Object factory too (press any key):");
    jc = JAXBContext.newInstance(example.a.RootType.class, example.a.ObjectFactory.class);
    work(jc); // SUCCEEDS

}

private static void work(JAXBContext jc) throws JAXBException, FileNotFoundException {
    Unmarshaller u = jc.createUnmarshaller();
    RootType root = ((JAXBElement<RootType>)u.unmarshal( new FileInputStream( "a.xml" ))).getValue();
    System.out.println( root.getValue() );
}

问题答案:

从XML模式生成的JAXB模型

JAXBContext从XML模式生成的模型中创建模型时,我总是建议对生成的类的包名称进行操作。

JAXBContext jc = JAXBContext.newInstance("example.a");

最好使用newInstance带有ClassLoader参数的方法。从Java SE迁移到Java EE环境时,这可以避免您的痛苦。

JAXBContext jc = JAXBContext.newInstance("example.a", example.a.ObjectFactory.class.getClassLoader());

JAXBContext包名称上创建时,JAXB
impl假定您是从XML模式生成模型的,并提取了ObjectFactory该类,因为它始终生成@XmlRegistry以该名称注释的类。

从Java模型开始

这是我建议人们使用newInstance采用类的方法的时候。JAXBContext从JAXB类引导时,关于的类没有什么特别的ObjectFactory。的角色ObjectFactory可以由任何带注解的类扮演,@XmlRegistry因此不会自动查找。这就是为什么您的用例在您明确引用ObjectFactory时起作用而在您未使用时失败的原因。



 类似资料:
  • 问题内容: 我在基于JBoss的Web应用程序中使用JAXBContext.newInstance操作。据我了解,此操作非常繁重。我只需要Marshaller类的两个唯一实例。 我最初的建议是要有一个静态初始值设定项块,该类将在加载类时仅初始化一次这两个实例: 如果这是一个合理的解决方案,那么我想我会回答自己的问题,但是我想知道这是否是正确的方法? 问题答案: JAXB实现(Metro,Eclip

  • 我正在开发一个程序来解决0/1背包问题的变体。 原始问题如下所述:https://en.wikipedia.org/wiki/Knapsack_problem.如果将来链接丢失,我会给你一个0/1背包问题的摘要(如果你熟悉它,跳过这一段):假设我们有项,每个项都有重量和值。我们想把物品放在一个袋子里,这个袋子支持最大重量,这样袋子里的总价值是最大的,而不会加重袋子的重量。项目不能有多个实例(即,我

  • 问题内容: 因此,我正在阅读《 实践 中的 Java并发性》 这本书,而我只能停留在这一解释上,没有一个例子,我似乎无法理解。这是报价: 当线程将数据写入易失性变量,然后线程 读取同一变量时,在写入易失性变量之前可见的所有变量的值 将在读取易失性变量后变为可见。 有人可以给我一个反例的原因,为什么“在写入易失性变量之前可见的所有变量的值在读取易失性变量之后就变得可见”? 我很困惑,为什么在读取易失

  • 问题内容: 我知道在PHP中可能有“变量”变量。例如 是否可以在JavaScript中将变量的名称引用为字符串?怎么做? 问题答案: 对此没有单一的解决方案(当然,有,但是请不要认真考虑)。可以通过来动态访问 一些 全局变量,但这不适用于函数本地的变量。 不会 成为属性的全局变量是使用和和定义的变量。 几乎总是比使用可变变量更好的解决方案! 相反,您应该查看数据结构并为您的问题选择正确的结构]。

  • 这可能是一个很傻的问题,但我挠头了很久也弄不明白其中的区别。 我正在浏览scala泛型页面:https://docs.scala-lang.org/tour/generic-classes.html 注意:泛型类型的子类型是不变的。这意味着,如果我们有一个stack[Char]类型的字符堆栈,那么它就不能用作stack[Int]类型的整数堆栈。这是不合理的,因为它使我们能够将真整数输入到字符堆栈中

  • 我正在上大学数据结构课程 当涉及到普通的MergeSort和自上而下的MergeSort时 - 有什么区别?到目前为止,我所读到的内容使我相信: “正常”MergeSort只是将已经排序的数组/文件拆分为两半,并将其放入辅助数组中。然后我们开始通过连续比较左边的元素和右边的元素来检查辅助数组,将这些元素按排序顺序写入原始数组。 自上而下的MergeSort递归地将一个未排序的数组拆分为更小的部分,