【问题标题】:SOAP WS-Addressing property with Wss4jSecurityInterceptor with JavaSOAP WS-Addressing 属性与 Wss4jSecurityInterceptor 与 Java
【发布时间】:2017-08-14 02:46:27
【问题描述】:

您好,我为使用 SOAP 服务创建代码,

对于 Authentication Header,我使用 Wss4jSecurityInterceptor 来设置 Header 信息。

我收到如下失败响应

 Exception in thread "main" org.springframework.ws.soap.client.SoapFaultClientException: Required element {http://www.w3.org/2005/08/addressing}Action is missing

我的配置代码如下

@Configuration
public class SoapClientConfig {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.xyz.client");
        marshaller.setCheckForXmlRootElement(false);
        return marshaller;
    }

    @Bean
    public MyClient myClient(Jaxb2Marshaller marshaller) throws Exception {
        MyClient client = new MyClient();
        client.setDefaultUri("https://localhost:8080/ws/service");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);

        ClientInterceptor[] interceptors = new ClientInterceptor[] {securityInterceptor()};

        client.setInterceptors(interceptors);
        return client;
    }

    @Bean
    public Wss4jSecurityInterceptor securityInterceptor() {
        Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
        wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
        wss4jSecurityInterceptor.setSecurementMustUnderstand(true);
        wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
        wss4jSecurityInterceptor.setSecurementUsername("XXXXXXXXXXX");
        wss4jSecurityInterceptor.setSecurementPassword("XXXXXXXX");
        return wss4jSecurityInterceptor;
    }
}

谁能建议我缺少什么?

如果我从 SOAPUI 尝试它的工作正常。如果我从 SOAPUI 设置 WS-Addressing=false 也会给我同样的错误,那么使用上面的代码设置 WS-Addressing 属性的问题。我该怎么办?

【问题讨论】:

标签: java web-services soap soap-client ws-addressing


【解决方案1】:

您是否使用 WebServiceTemplate 发送请求?如果是,您可以执行以下操作:

ActionCallback callback = new ActionCallback(
                    new URI("action uri"));

您应该在此处提供实际的操作 uri 位置,而不是“操作 uri”。然后,做

getWebServiceTemplate().marshalSendAndReceive(request, callback)

【讨论】:

  • 我的 SOAP 标头已包含此操作信息。也在那里解决财产问题,然后我也正在解决问题
  • 那么你能把处理请求构建和发送的整个代码贴出来吗?
  • 这个问题很奇怪,它取决于定义的动作序列。如果我在安全元素之前定义动作,它会显示错误。如果我在安全之后定义操作它的工作原理。
  • 当此 URL 与端点不同时,我找不到在客户端上设置“wsa:To”标头的方法。
【解决方案2】:

很久以前就开始使用动态值填充 SOAP Header,为此您需要使用回调对象构建 xml 节点...WebServiceMessageCallback

http://docs.spring.io/spring-ws/site/reference/html/client.html#d5e1848

在我的场景中,我需要使用 QName (Java) Node by Node 构建节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2016-01-31
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多