在JBoss上部署后,在SOAP WSDL中将枚举类型擦除为字符串

在JBoss上部署后,在SOAP WSDL中将枚举类型擦除为字符串,soap,jboss,wsdl,cxf,Soap,Jboss,Wsdl,Cxf,这里是一个soapweb服务。它最初是通过wsdl/xsd定义的。然后,Java类由ApacheCXF生成。然后一场战争被构建并部署到JBoss上 问题。wsdl JBoss向世界公开的版本与我编写的版本有很大不同-在下面的示例中,自定义枚举类型水果被删除为原始字符串类型。因此,没有关于枚举的类型检查-任何非空字符串值都可以由客户端“成功”传递给服务,而不会出现模式不满足错误;Java服务实现在这种情况下接收nullenum(尽管它是一个强制参数) 问题。如何在运行时防止此类枚举类型擦除?或如何

这里是一个soapweb服务。它最初是通过wsdl/xsd定义的。然后,Java类由ApacheCXF生成。然后一场战争被构建并部署到JBoss上

问题。wsdl JBoss向世界公开的版本与我编写的版本有很大不同-在下面的示例中,自定义枚举类型
水果
被删除为原始字符串类型。因此,没有关于枚举的类型检查-任何非空字符串值都可以由客户端“成功”传递给服务,而不会出现模式不满足错误;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;