CXF wsdl导致org.apache.wss4j.policy.model.AlgorithmSuite的ClassCastException

时间:2017-01-10 13:15:53

标签: java wsdl cxf wsdl2java

我有一个由我需要访问的服务提供的wsdl。我正在使用CXF V3.1.7,它检测到提供的wsdl的一些问题。我解决了两个问题,如下所示。但是当时有效的wsdl导致了ClassCastException

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: org.apache.neethi.builders.PolicyContainingPrimitiveAssertion cannot be cast to org.apache.wss4j.policy.model.AlgorithmSuite
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
    at com.sun.proxy.$Proxy68.creditSearch(Unknown Source)
    at uk.co.example.service.TestServiceClient.directSearch(TestServiceClient.java:139)
    at uk.co.example.service.TestServiceClient.main(TestServiceClient.java:71)
Caused by: java.lang.ClassCastException: org.apache.neethi.builders.PolicyContainingPrimitiveAssertion cannot be cast to org.apache.wss4j.policy.model.AlgorithmSuite
    at org.apache.wss4j.policy.model.AbstractBinding.parseNestedBindingPolicy(AbstractBinding.java:78)
    at org.apache.wss4j.policy.model.AbstractBinding.<init>(AbstractBinding.java:43)
    at org.apache.wss4j.policy.model.TransportBinding.<init>(TransportBinding.java:36)
    at org.apache.wss4j.policy.builders.TransportBindingBuilder.build(TransportBindingBuilder.java:45)
    at org.apache.wss4j.policy.builders.TransportBindingBuilder.build(TransportBindingBuilder.java:34)
    at org.apache.neethi.AssertionBuilderFactoryImpl.invokeBuilder(AssertionBuilderFactoryImpl.java:138)
    at org.apache.neethi.AssertionBuilderFactoryImpl.build(AssertionBuilderFactoryImpl.java:117)
    at org.apache.neethi.PolicyBuilder.processOperationElement(PolicyBuilder.java:224)
    at org.apache.neethi.PolicyBuilder.getAllOperator(PolicyBuilder.java:184)
    at org.apache.neethi.PolicyBuilder.processOperationElement(PolicyBuilder.java:217)
    at org.apache.neethi.PolicyBuilder.getExactlyOneOperator(PolicyBuilder.java:180)
    at org.apache.neethi.PolicyBuilder.processOperationElement(PolicyBuilder.java:215)
    at org.apache.neethi.PolicyBuilder.getPolicyOperator(PolicyBuilder.java:174)
    at org.apache.neethi.PolicyBuilder.getPolicy(PolicyBuilder.java:124)
    at org.apache.cxf.ws.policy.attachment.reference.LocalServiceModelReferenceResolver.resolveReference(LocalServiceModelReferenceResolver.java:53)

wsdl文件的相关部分是:

<wsp1:Policy sch0:Id="ConsumerServiceSoap11Policy">
<wsp1:ExactlyOne>
  <wsp1:All>
    <sp1:TransportBinding>
      <wsp1:Policy>
        <sp1:TransportToken>
          <wsp1:Policy>
            <sp1:HttpsToken RequireClientCertificate="false">
                <wsp1:Policy/>
            </sp1:HttpsToken>
          </wsp1:Policy>
        </sp1:TransportToken>
        <sp:AlgorithmSuite>
            <wsp:Policy>
                <sp:Basic256/>
            </wsp:Policy>
        </sp:AlgorithmSuite>
        <sp1:Layout>
          <wsp1:Policy>
            <sp1:Lax/>
          </wsp1:Policy>
        </sp1:Layout>
        <!--sp1:IncludeTimestamp/-->
      </wsp1:Policy>
    </sp1:TransportBinding>

我在HttpsToken元素中添加了空的Policy元素,并添加了AlgorithmSuite元素,使CXF接受它对CXF wsdl2java有效。

以下是我包含的相关CXF依赖项。

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-policy</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.wss4j</groupId>
        <artifactId>wss4j-ws-security-common</artifactId>
        <version>2.1.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-security</artifactId>
        <version>${cxf.version}</version>
    </dependency>

如何防止此异常?

1 个答案:

答案 0 :(得分:0)

看起来你正在混淆命名空间定义,例如: TransportBinding具有“sp1:”而AlgorithmSuite具有“sp:”。