我们有JAX风格的web服务,其复杂类型定义如下:
<xs:complexType name = "SomeFault">
<xs:sequence>
<xs:element name = "errorMessages" type="some:ErrorMessageWSType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name = "ErrorMessageWSType">
<xs:restriction base = "xs:NMTOKEN">
<xs:enumeration value = "INVALID_1"/>
<xs:enumeration value = "INVALID_2"/>
<xs:enumeration value = "INVALID_3"/>
</xs:restriction>
</xs:simpleType>当响应/故障复杂类型有一个数组类型字段时,我们将在服务器端遇到封送异常。
"[Lnamespace.type.ErrorMessageWSType;@693767e9".:
weblogic.wsee.codec.CodecException:未能编码com.bea.xml.XmlException:未能找到在编组对象com.bea.xml.XmlException中使用的合适绑定类型使用模式类型: t=SomeFault@http://namespace/SOME/v1 java类型:namespace.type.ErrorMessageWSType[]
如果我们更改SomeFault,通过向复杂类型添加另一个元素,错误就会消失。
<xs:complexType name = "SomeFault">
<xs:sequence>
<xs:element name = "errorMessages" type="some:ErrorMessageWSType" maxOccurs="unbounded" />
<xs:element name = "dummyString" type="xsd:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>我们是在wsdlc代码生成过程中做错了什么,还是这是一个已知的问题?
https://forums.oracle.com/forums/thread.jspa?messageID=4462906上已经发布了一个类似的问题,但是如果没有任何回应,任何提示都会很好。
谢谢。
发布于 2011-10-24 21:52:41
不知道这是否解决了问题的“为什么”部分,但您可以尝试重写序列部分如下:
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="errorMessages" type="some:ErrorMessageWSType"/>
</xs:sequence>OTOH,让第二个案例起作用的机制是什么,而不是第一个?在检查xsd:string的含义之前,封送处理程序可能必须先弄清楚some:ErrorMessageWSType的含义,然后才能唤醒解析器或其他什么?这一思路导致了我尝试的第二种方法,即在SomeFault之前声明SomeFault(或者在另一个名称空间中,看看是否修复了任何问题)。
只是我(累了)两分钱,我猜这两种方法都假定编组程序中存在某种bug,因为我看不出示例代码中的任何内容都不符合XML模式定义。
https://stackoverflow.com/questions/7802649
复制相似问题