【发布时间】:2012-12-06 04:15:18
【问题描述】:
我有一个定义以下类型的架构:
<xsd:complexType name="Payload">
<xsd:sequence>
<xsd:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
这会创建一个像这样的对象:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Payload", propOrder = {
"any"
})
public class Payload {
@XmlAnyElement(lax = true)
protected List<Object> any;
}
现在我尝试将另一个生成的 JAXB 对象添加到该 Payload,执行如下操作:
Class payloadClass = ...;
JAXBContext context = JAXBContext.newInstance( WrapperRequest.class, payloadClass);
...
marshaller.marshal( wrappedRequest );
但是我遇到了一个可怕的异常,看起来它永远不会起作用,所以我决定先将有效负载对象序列化为 XML,然后将其作为字符串添加到有效负载中。
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance( sdoRequest.getClass() );
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(new JAXBElement(new QName("uri", sdoRequest.getClass().getSimpleName()), sdoRequest.getClass(), sdoRequest), writer);
payload.getAny().add( writer.toString() );
这会引发异常,说“java.lang.String”不包含@XmlRootElement。
那么 xs:any 将如何与 JAXB 一起使用呢?似乎什么都不想工作,因为 JAXB 将 Payload 转换为 Object,并且它不会序列化 Object 中的任何内容。这也都在 Axis2 内部,因此达到这一点非常具有挑战性。
【问题讨论】:
-
当您尝试将包装的对象添加到 Any 有效负载时会出现什么异常?
-
以下内容应该会有所帮助:blog.bdoughan.com/2010/08/…
-
这部分是我对 WSDL 的控制为零的方式。但是,包装请求是在一个 WSDL 中定义的,而进入有效负载的请求是在另一个 WSDL 中定义的。它们都声明了一个 BaseRequest,但是在生成代码时它们是不同的类。我得到了这个异常两个类具有相同的 XML 类型名称 {esp.lala.com/2012/eo}BaseRequest.使用@XmlType.name 和@XmlType.namespace 为它们分配不同的名称。
-
@BlaiseDoughan 添加到有效负载的对象未使用 @XmlRootElement 进行注释,因为它是从 WSDL 生成的。我该怎么办?我添加的错误呢?看到有什么简单的方法吗?
-
+one 表示“我遇到了一个看起来永远无法工作的可怕异常”