16

我在 Netbeans 7.1.2 中使用 JaxB 时遇到问题。

我已经使用 JaxB(新 JaxB 绑定)从模式中自动生成了我的类。我正在创建将使用 Marshaller 序列化为 XML 字符串的对象,然后从 XML 字符串返回到新的对象实例。但是,我得到以下异常:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none)

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

我正在使用以下代码构建对象并将其编组为 XML 字符串:

// build the object
ObjectFactory of = new ObjectFactory();

MyQueryComplexType oaaqc = of.createMyQueryComplexType();
oaaqc.setField1("edit");
oaaqc.setField2("net");
oaaqc.setField3("24");

JAXBElement<MyQueryComplexType> createMyQueryComplexType = of.createMyQueryComplexTypeQuery(oaaqc);

// serialise to xml
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);            
Marshaller m = context.createMarshaller();
m.marshal(createMyQueryComplexType, writer);

// output string to console
String theXML = writer.toString();
System.out.println(theXML);

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyQueryComplexTypeQuery xmlns="http://www.somewhere.com/some/path">
    <Field1>edit</Field1>
    <Field2>net</Field2>
    <Field3>24</Field3>
</MyQueryComplexTypeQuery>

现在我使用以下代码将字符串反序列化/解组为新实例 MyQueryComplexType:

Unmarshaller u = context.createUnmarshaller();
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));

在自动生成的 package-info.java 中有以下内容:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somewhere.com/some/path", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package MyProject.SomeNamespace.MyQuery;

我认为 object -> string -> object 的简单过程会起作用。这是我第一次使用 JaxB(所以要温柔)。我看过其他提到命名空间的帖子,对我来说一切都很好。我已经从模式中自动生成了类,构造了对象,编组为 xml 字符串。我认为简单地反转 unmarshal 的过程是相似的。

实际的异常是在线抛出的:

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

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

我已经减少了代码以简化我的应用程序中导致错误的内容。命名空间已更改以保护网络上事物的身份。

有什么想法吗?

谢谢

安德斯

4

1 回答 1

19

创建JAXBContext

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

JAXBContext context = JAXBContext.newInstance("your.package.name");

不是:

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

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

解组操作

请注意,在您的编组操作期间,您需要将您的实例包装MyQueryComplexTypeJAXBElement? 这是因为MyQueryComplexType没有使用注释,@XmlRootElement并且根元素信息需要来自JAXBElement. 这意味着当您执行 unmarshal 操作时,您也会得到JAXBElement回报。

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

不是:

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

了解更多信息

于 2012-11-08T13:58:07.243 回答