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

Java JaxB-对象到XML字符串到对象,xml,jaxb,Xml,Jaxb,我在Netbeans 7.1.2中使用JaxB时遇到了一个问题 我已经使用JaxB(新的JaxB绑定)从模式自动生成了我的类。我创建的对象将使用封送拆收器序列化为XML字符串,然后从XML字符串返回到新的对象实例。但是,我得到以下例外情况: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery")

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

我已经使用JaxB(新的JaxB绑定)从模式自动生成了我的类。我创建的对象将使用封送拆收器序列化为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);
在自动生成的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字符串。我认为简单地反转解组过程也会类似

实际异常在第行抛出:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
我以为我在做从字符串到对象的解组会很简单。我不知道我是做错了什么还是错过了什么。我希望你们能给我点启示或者让我睁开眼睛

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

有什么想法吗

谢谢


Andez

创建
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 o=(JAXBElement)u.unmarshal(新StringReader(theXML));
不是:

MyQueryComplexType查询o=(MyQueryComplexType)u.unmarshal(新StringReader(theXML));
了解更多信息


太好了,谢谢布莱斯。它现在既可以使用JAXBContext.newInstance(“your.package.name”),也可以使用JAXBElement来解组。如果我能+100,我会的。@Andez你实际上能+100。事后你可以给一些赏金。
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somewhere.com/some/path", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package MyProject.SomeNamespace.MyQuery;
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));