Java JaxB-对象到XML字符串到对象

我在Netbeans 7.1.2中使用JaxB时遇到了一个问题

我已经使用JaxB(新的JaxB绑定)从模式自动生成了我的类。我创建的对象将使用封送拆收器序列化为XML字符串,然后从XML字符串返回到新的对象实例。但是,我得到以下例外情况:

javax.xml.bind.UnmarshaleException:意外元素(uri:http://www.somewhere.com/some/path,本地:“MyQueryComplexTypeQuery”)。预期元素为(无)

编组/序列化为XML字符串工作正常。正是当它被解组/反序列化时才导致问题

我使用以下代码构建对象并将其封送为XML字符串:

//构建对象
ObjectFactory of=新的ObjectFactory();
MyQueryComplexType oaaqc=of.createMyQueryComplexType();
oaaqc.setField1(“编辑”);
oaaqc.setField2(“净”);
oaaqc.setField3(“24”);
贾克斯贝伦<MyQueryComplexType>createMyQueryComplexType=of.createMyQueryComplexTypeQuery(oaaqc);
//序列化为xml
StringWriter编写器=新的StringWriter();
JAXBContext context=JAXBContext.newInstance(MyQueryComplexType.class);
Marshaller m=context.createMarshaller();
m、 封送处理(createMyQueryComplexType,编写器);
//将字符串输出到控制台
字符串theXML=writer.toString();
System.out.println(theXML);

这将在控制台中生成以下XML(格式化):

<?xml version=“1.0”encoding=“UTF-8”standalone=“是”?>
<MyQueryComplexTypeQuery xmlns=”http://www.somewhere.com/some/path“>
<字段1>编辑&lt/字段1>
<字段2>净值&lt/字段2>
<字段3>24&lt/字段3>
&lt/MyQueryComplexTypeQuery>

现在,我将使用以下代码将字符串反序列化/反汇编到一个新实例MyQueryComplexType:

Unmarshaller u=context.createUnmarshaller();
MyQueryComplexType查询o=(MyQueryComplexType)u.unmarshal(新StringReader(theXML));

在自动生成的package-info.java中,它包含以下内容:

@javax.xml.bind.annotation.XmlSchema(命名空间=”http://www.somewhere.com/some/path,elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
包MyProject.SomeNamespace.MyQuery;

我认为简单的object->string->object过程就可以了。这是我第一次使用JaxB(所以请温柔一点)。我看过其他提到名称空间的帖子,我觉得一切都很好。我已经从模式中自动生成了类,构建了对象,编组为xml字符串。我认为简单地反转解组过程也会类似

实际异常在第行抛出:

MyQueryComplexType查询o=(MyQueryComplexType)u.unmarshal(新StringReader(theXML));

我以为我在做从字符串到对象的解组会很简单。我不知道我是做错了什么还是错过了什么。我希望你们能给我点启示或者让我睁开眼睛

我已经减少了代码,以简化我的应用程序中导致错误的内容。名称空间已被更改,以保护web上事物的标识

有什么想法吗

谢谢

安第斯

创建JAXBContext

对于从XML模式生成的JAXB模型,可以在包名称上而不是在特定类上创建JAXBContext

JAXBContext context=JAXBContext.newInstance(“your.package.name”);

不是:

JAXBContext context=JAXBContext.newInstance(MyQueryComplexType.class);

这将确保正确处理包含@xmlementdecl注释的ObjectFactory类,这是用例中缺少的

解组操作

请注意,在封送处理操作期间,您需要将MyQueryComplexType的实例包装在JAXBElement中?这是因为MyQueryComplexType没有用@XmlRootElement注释,根元素信息需要来自JAXBElement。这意味着,当您执行解组操作时,也会返回一个JAXBElement

JAXBElement<MyQueryComplexTypeQuery>o=(JAXBElement<MyQueryComplexType>)u.unmarshal(新StringReader(theXML));

不是:

MyQueryComplexTypeQuery o=(MyQueryComplexType)u.unmarshal(新StringReader(theXML));

了解更多信息

  • http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html

发表评论