我在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>;编辑</字段1>;
<;字段2>;净值</字段2>;
<;字段3>;24</字段3>;
</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