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

JAXB unmarshaller.unmarshal何时返回JAXBElement 或MySchemaObject?

田博易
2023-03-14
问题内容

我在两个不同的Java项目中有两个代码,几乎可以完成相同的工作(根据xsd文件解组Web服务的输入)。

但是在一种情况下,我应该这样写:(输入是一个占位符名称)(元素是OMElement输入)

ClassLoader clInput = input.ObjectFactory.class.getClassLoader();
JAXBContext jc = JAXBContext.newInstance("input", clInput);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() );

在另一个库中,我必须使用JAXBElement.getValue(),因为它是返回的JAXBElement,并且简单的(Input)强制转换会崩溃:

Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() ).getValue();

您知道导致这种差异的原因吗?


问题答案:

如果根元素唯一地对应于Java类,则将返回该类的实例,否则将返回a JAXBElement

如果要确保始终获取域对象的实例,则可以利用JAXBInstrospector。下面是一个例子。

演示版

package forum10243679;

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    private static final String XML = "<root/>";

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        JAXBIntrospector jaxbIntrospector = jc.createJAXBIntrospector();

        Object object = unmarshaller.unmarshal(new StringReader(XML));
        System.out.println(object.getClass());
        System.out.println(jaxbIntrospector.getValue(object).getClass());

        Object jaxbElement = unmarshaller.unmarshal(new StreamSource(new StringReader(XML)), Root.class);
        System.out.println(jaxbElement.getClass());
        System.out.println(jaxbIntrospector.getValue(jaxbElement).getClass());
    }

}

输出量

class forum10243679.Root
class forum10243679.Root
class javax.xml.bind.JAXBElement
class forum10243679.Root


 类似资料:
  • 我有两个代码,在两个不同的java项目中,执行几乎相同的操作(根据xsd文件解组Web服务的输入)。 但在一个例子中,我应该这样写:(Input是一个占位符名称)(element是OMElement Input) 在另一个库中,我必须使用JAXBElement。getValue(),因为它是返回的JAXBElement,并且简单(输入)转换会崩溃: 你知道是什么导致了这种差异吗?

  • 问题内容: 从测试中,我得出结论,在以下三种情况下,结果将会恢复。 连接关闭后。例如,客户端调用socket.close()或发生任何套接字错误,它将返回空字符串。 有些数据来了,数据的大小超过。 一些数据来了,数据的大小小于并且短时间后没有更多数据来了(我发现0.1s可以工作)。 有关#3的更多详细信息: 当我运行时,回显: 当我运行时,回显: 我的结论正确吗?在哪里可以看到有关#3的官方说明?

  • 我知道当对象是特定类的实例时,instanceof返回TRUE。例如:

  • 问题内容: 当用Java编程时,我几乎总是出于习惯,编写如下代码: 大多数时候甚至都没有考虑它。现在,问题是:我应该 始终 将接口指定为返回类型吗?还是建议使用接口的实际实现,如果是,在什么情况下使用? 显然,使用该接口有很多优点(这就是为什么它存在的原因)。在大多数情况下,库函数使用哪种具体实现并不重要。但也许在某些情况下确实很重要。例如,如果我知道我将主要随机访问列表中的数据,那将是一个坏习惯

  • 问题内容: 说我有一些Java代码: 还有一些代码可以加载: 能永远?为什么/为什么不呢?如果是这样,在什么情况下? 问题答案: 根据此方法javadoc: 返回该类的类加载器。一些实现可能使用null来表示引导类加载器。如果此类是由bootstrap类加载器加载的,则此方法在此类实现中将返回null。

  • 这三个函数的返回类型提示有什么不同吗? 他们都应该有< code>- 提问的动机是这个问题,这个很好的答案,以及我正在学习类型提示的事实。