在JBoss上部署后,在SOAP WSDL中将枚举类型擦除为字符串
这里是一个soapweb服务。它最初是通过wsdl/xsd定义的。然后,Java类由ApacheCXF生成。然后一场战争被构建并部署到JBoss上 问题。wsdl JBoss向世界公开的版本与我编写的版本有很大不同-在下面的示例中,自定义枚举类型在JBoss上部署后,在SOAP WSDL中将枚举类型擦除为字符串,soap,jboss,wsdl,cxf,Soap,Jboss,Wsdl,Cxf,这里是一个soapweb服务。它最初是通过wsdl/xsd定义的。然后,Java类由ApacheCXF生成。然后一场战争被构建并部署到JBoss上 问题。wsdl JBoss向世界公开的版本与我编写的版本有很大不同-在下面的示例中,自定义枚举类型水果被删除为原始字符串类型。因此,没有关于枚举的类型检查-任何非空字符串值都可以由客户端“成功”传递给服务,而不会出现模式不满足错误;Java服务实现在这种情况下接收nullenum(尽管它是一个强制参数) 问题。如何在运行时防止此类枚举类型擦除?或如何
水果
被删除为原始字符串类型。因此,没有关于枚举的类型检查-任何非空字符串值都可以由客户端“成功”传递给服务,而不会出现模式不满足错误;Java服务实现在这种情况下接收null
enum(尽管它是一个强制参数)
问题。如何在运行时防止此类枚举类型擦除?或如何教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>
虽然
看起来像是枚举的正确定义,但它会导致CXF添加@XmlSchemaType(name=“string”)
,这会导致JBoss在运行时生成一个“坏的”wsdl
JBoss EAP 6.4.0、Spring 4、Apache CXF、Java 7请您将这两个WSDL文件全部作为附件或其他内容提供。你确定你创建的文件是有效的吗?因为关闭了源,所以发布完整文件很困难。。。但是我找到了问题的根源——你可以看到更新。我明白了。我这样问是因为我怀疑类型引用在wsdl中是否正确完成。当解释器不确定该做什么时,可能会将字符串作为默认值。否则,枚举定义在我看来还可以…为什么你没有提到如何解决这个问题。。。
<!-- http://localhost:8080/example/PickFruitEndpoint?wsdl -->
<xs:complexType name="pickFruitRequest">
<xs:sequence>
<xs:element name="fruit" type="xs:string"/>
</xs:sequence>
</xs:complexType>
public class PickFruitRequest {
@XmlElement(required = true)
@XmlSchemaType(name = "string") // it forces type erasure!
protected Fruit fruit;