这是一个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