在JBoss上部署之后,枚举类型在SOAP WSDL中被删除为字符串

时间:2015-12-23 09:01:11

标签: soap jboss wsdl cxf

这是一个SOAP Web服务。它最初是通过wsdl / xsd定义的。然后Java类由Apache CXF生成。然后建立了战争并部署到JBoss上。

问题。 wsdl JBoss暴露在世界上与我写的明显不同 - 在下面的示例中,自定义枚举类型Fruit被删除为原始字符串类型。因此,没有关于枚举的类型检查 - 任何非空字符串值都可以被客户端“成功”传递给服务,而不会出现模式不满足的错误;在这种情况下,Java服务实现会收到null枚举(尽管它是强制性的参数)。

问题。如何在运行时阻止此类枚举类型的删除?要么。如何教web服务严格检查枚举请求?

服务的原始定义:

<!-- SOAP WSDL: -->

<wsdl:operation name="pickFruit">
 <soap:operation soapAction="http://www.example.com/ws/pickFruit"/>
 <wsdl:input>
  <soap:body use="literal"/>
 </wsdl:input>
 <wsdl:output>
  <soap:body use="literal"/>
 </wsdl:output>
</wsdl:operation>

<!-- XSD, the request: -->

<xs:element name="pickFruitRequest" type="pickFruitRequest"/>
<xs:complexType name="pickFruitRequest">
 <xs:sequence>
  <xs:element name="fruit" type="Fruit" minOccurs="1" maxOccurs="1"/>
 </xs:sequence>
</xs:complexType>

<!-- XSD, the enum: -->

<xs:simpleType name="Fruit">
 <xs:restriction base="xs:string">
  <xs:enumeration value="orange"/>
  <xs:enumeration value="kiwi"/>
  <xs:enumeration value="potato"/>
 </xs:restriction>
</xs:simpleType>

JBoss公开的WSDL:

<!-- http://localhost:8080/example/PickFruitEndpoint?wsdl -->

<xs:complexType name="pickFruitRequest">
 <xs:sequence>
  <xs:element name="fruit" type="xs:string"/>
 </xs:sequence>
</xs:complexType>

UPDATE。 CXF自动生成的请求类:

public class PickFruitRequest {
  @XmlElement(required = true)
  @XmlSchemaType(name = "string") // it forces type erasure!
  protected Fruit fruit;

尽管<xs:restriction base="xs:string">看起来像是枚举的正确定义,但它会导致CXF添加@XmlSchemaType(name = "string")导致JBoss在运行时生成“坏”wsdl。

JBoss EAP 6.4.0,Spring 4,Apache CXF,Java 7

0 个答案:

没有答案