wsdl - WSP0075:策略断言“TransportBinding”被评估为“未知”。为什么?

标签 wsdl cxf jax-ws soap-client wsdl2java

我是不受控制的SOAP服务的客户端(在.NET中实现)。该服务提供了WSDL。我使用Apache CXF从WSDL生成Java客户端(特别是,我在Maven中使用cxf-codegen-plugin,在后台使用wsdl2java)。

但是,当我实例化生成的服务类时,将记录以下警告:

Sep 04, 2014 5:18:00 PM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector]  selectAlternatives
WARNING: WSP0075: Policy assertion "{http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}TransportBinding" was evaluated as "UNKNOWN".
Sep 04, 2014 5:18:00 PM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector]  selectAlternatives
WARNING: WSP0019: Suboptimal policy alternative selected on the client side with fitness "UNKNOWN".


但是客户端可以正常工作-我使用该服务没有任何问题。但是,我对这些错误感到困惑。

错误是关于WSDL中的此安全策略的,我认为它说它无法理解:

<wsp:Policy wsu:Id="soap11_policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
  <wsp:ExactlyOne>
    <wsp:All>
      <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
        <wsp:Policy>
          <sp:TransportToken>
            <wsp:Policy>
              <sp:HttpsToken RequireClientCertificate="false"/>
            </wsp:Policy>
          </sp:TransportToken>
          <sp:AlgorithmSuite>
            <wsp:Policy>
              <sp:Basic256/>
            </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
            <wsp:Policy>
              <sp:Strict/>
            </wsp:Policy>
          </sp:Layout>
        </wsp:Policy>
      </sp:TransportBinding>
    </wsp:All>
  </wsp:ExactlyOne>
</wsp:Policy>


但是据我所知,这是一项完全普通的政策,没有什么不寻常的地方。当然应该理解吗?如何解决此警告?

记录一下,这是wsdl2java的调用方式(摘自pom.xml)。

-exsh true arg和cxf-rt-bindings-soap依赖性是因为WSDL在其参数中使用了一些隐式的肥皂头,而我需要这个,以便它们正确地包含在生成的服务类方法中。

我添加了cxf-rt-ws-securitycxf-rt-ws-policy依赖项来尝试解决此警告,并认为可能不包括安全性和策略信息。但是,这并不能解决任何问题(尽管也没有任何问题)。

<plugin>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-codegen-plugin</artifactId>
  <version>3.0.1</version>
  <executions>
    <execution>
      <id>rh-soap-client-ssi</id>
      <phase>generate-sources</phase>
      <configuration>
        <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
        <wsdlOptions>
          <wsdlOption>
            <wsdl>https://example.org/ssi?wsdl</wsdl>
            <extraargs>
              <extraarg>-verbose</extraarg>
              <extraarg>-client</extraarg>
              <extraarg>-mark-generated</extraarg>
              <extraarg>-exsh</extraarg>
              <extraarg>true</extraarg>
              <extraarg>-autoNameResolution</extraarg>
            </extraargs>
          </wsdlOption>
        </wsdlOptions>
      </configuration>
      <goals>
        <goal>wsdl2java</goal>
      </goals>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-bindings-soap</artifactId>
      <version>3.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-ws-security</artifactId>
      <version>3.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-ws-policy</artifactId>
      <version>3.0.1</version>
    </dependency>
  </dependencies>
</plugin>

最佳答案

通过猜测和查看Maven Central中的工件,我找到了解决方案。

事实证明,为了真正理解和评估wsdl中的策略,必须提供缺少的运行时依赖项。对我来说是org.apache.cxf/cxf-rt-frontend-jaxws。我在任何地方都找不到此文档。这引入了许多其他cxf依赖关系,我不知道是否可以使用更小的一组依赖关系。

包含此依赖关系后,实例化客户端对象时将不再收到警告。 (此外,实例化需要更长的时间!)

但是,当我尝试使用该服务时,出现异常:

javax.xml.ws.soap.SOAPFaultException: None of the policy alternatives can be satisfied.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:159)
    ...


这很可能是由于Willie Wheeler的答案指出的原因:该策略要求在传输上使用256位加密,但是此服务的SSL使用128位加密。但是,将wsdl与Base128一起使用不能解决此异常,因此我没有做进一步调查。

因此,使用此服务的每个人都有可能收到此警告或类似的警告,并且如果实际检查了安全策略,则不可能使用此服务。我想我会忍受警告。

关于wsdl - WSP0075:策略断言“TransportBinding”被评估为“未知”。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25676235/

相关文章:

.NET 5.0 和 SOAP Web 服务

.net - 如何使 dotnet web 服务在字符串值上设置 minOccurs ="1"

java - apache cxf 中使用 queryParam 的方法选择

Java WS 仅在 tcp/ip 监视器打开时响应

java:JAXWS 2.0 不支持 Rpc/编码的 wsdls

java - 基于ONVIF wsdl(Top Down Method)生成Java webservice

java - XML 中缺少 jax-ws 必需的元素

java - Apache CXF 拦截器覆盖内容类型

https - 如何通过 https 使用 wsdl2java 生成客户端代码?

maven-2 - 默认情况下跳过maven2插件