我在Netbeans 7.1.2中使用JaxB时遇到问题.
我使用JaxB(New JaxB Binding)从模式自动生成了我的类.我正在使用Marshaller创建将序列化为XML字符串的对象,然后从XML String返回到新的对象实例.但是,我得到以下异常:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none)
Run Code Online (Sandbox Code Playgroud)
编组/序列化到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);
Run Code Online (Sandbox Code Playgroud)
这会在控制台中生成以下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>
Run Code Online (Sandbox Code Playgroud)
现在,我使用以下代码将字符串反序列化/解组化为新实例MyQueryComplexType:
Unmarshaller u = context.createUnmarshaller();
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)
在auto生成的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;
Run Code Online (Sandbox Code Playgroud)
我认为对象的简单过程 - > string - >对象会起作用.这是我第一次使用JaxB(所以要温和).我看过其他帖子提到名称空间,一切看起来都不错.我已从模式自动生成类,构造了对象,编组为xml字符串.我认为简单地逆转unmarshal的过程会是类似的.
实际的异常被抛出:
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)
我以为我正在做从字符串到对象的解组很简单.我不知道我做错了什么或遗漏了什么.我希望你们能摆脱一些亮光或睁开我的眼睛.
我已经减少了代码,以简化我的应用程序中导致错误的内容.已更改命名空间以保护Web上的事物的标识.
有什么想法吗?
谢谢
Andez
bdo*_*han 18
创造 JAXBContext
对于从XML模式生成的JAXB模型,您可以JAXBContext在包名称上创建,而不是在特定类上创建:
JAXBContext context = JAXBContext.newInstance("your.package.name");
Run Code Online (Sandbox Code Playgroud)
不:
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);
Run Code Online (Sandbox Code Playgroud)
这将确保正确处理ObjectFactory包含@XmlElementDecl注释的类,这是您的用例中缺少的内容.
Unmarshal Operation
请注意,在编组操作期间,您需要将实例包装MyQueryComplexType在一个JAXBElement?这是因为MyQueryComplexType没有注释,@XmlRootElement并且需要来自的根元素信息JAXBElement.这意味着当你进行解组操作时,你也会得到一个JAXBElement回复.
JAXBElement<MyQueryComplexTypeQuery> o = (JAXBElement<MyQueryComplexType>) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)
不:
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息