我有一个XML用于配置一些规则,它没有复杂的结构,但是这个配置在我的系统中的任何地方使用,所以我想将这个XML解析为java对象并设计为单例模式,这是我的好方法可以使用它直接解析XML到Java对象而无需编写太多代码?
我做了一些关于谷歌的研究,知道JAXB是一个选择,我的应用程序只是一些工具程序,它读取规则,然后按照做的东西,JAXB可以更广泛地用于Web服务,它适合我的项目?
如果是的话,最重要的问题是,我用xjc根据xsd文件生成java对象的源类,解组之后我会直接得到这些configurationType对象,是否有必要再次转换,(从JaxB类到我拥有的java pojo对象)配置),我看到大多数编码器做到了这一点,但为什么呢?因为它们是一些数据,只是从生成的对象到JAXB并复制到自己创建的POJO对象
我有两个代码,在两个不同的java项目中,做了几乎相同的事情,(根据xsd文件解组webservice的输入).
但在一种情况下我应该这样写:(输入是一个占位符名称)(元素是OMElement输入)
ClassLoader clInput = input.ObjectFactory.class.getClassLoader();
JAXBContext jc = JAXBContext.newInstance("input", clInput);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() );
Run Code Online (Sandbox Code Playgroud)
在另一个lib中,我必须使用JAXBElement.getValue(),因为它是一个返回的JAXBElement,一个简单的(Input)转换只是崩溃:
Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() ).getValue();
Run Code Online (Sandbox Code Playgroud)
你知道是什么导致了这样的差异吗?
我已经使用xjc
xsd 生成了java类,其中根元素是A
类型的AType
.
jaxb生成的根元素是AType
&没有A
生成类.
当我尝试解组对应于该xsd的xml并强制转换JaxbElement时,它会抛出一个强制转换异常:
片段:
JAXBContext jaxbContext = JAXBContext.newInstance(Class.forName("AType"));
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
AType aType = (AType) unmarshaller.unmarshal(new ByteArrayInputStream(xmlString.getBytes()));
例外:
java.lang.ClassCastException: javax.xml.bind.JAXBElement
其他案例的相同代码正确执行并成功反序列化.
我怎样才能找到unmarshal()
给我什么类型的对象?我不知道在这种情况下出了什么问题,我已经尝试打印出那些字段,jaxbElement
但它不是很有用!