首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SOAP WS-Addressing属性与Wss4jSecurityInterceptor

SOAP WS-Addressing属性与Wss4jSecurityInterceptor
EN

Stack Overflow用户
提问于 2017-03-22 14:12:08
回答 2查看 1.6K关注 0票数 11

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

对于身份验证标头,我使用Wss4jSecurityInterceptor作为设置标头信息。

我收到下面这样的失败响应

代码语言:javascript
复制
 Exception in thread "main" org.springframework.ws.soap.client.SoapFaultClientException: Required element {http://www.w3.org/2005/08/addressing}Action is missing

我的配置代码如下

代码语言:javascript
复制
@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属性就会出现问题。我怎么能做到呢?

EN

回答 2

Stack Overflow用户

发布于 2017-03-28 19:45:22

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

代码语言:javascript
复制
ActionCallback callback = new ActionCallback(
                    new URI("action uri"));

在这里你应该提供操作的实际uri位置,而不是"action uri“。然后,请执行以下操作

代码语言:javascript
复制
getWebServiceTemplate().marshalSendAndReceive(request, callback)
票数 6
EN

Stack Overflow用户

发布于 2017-03-29 15:12:30

在使用动态值填充SOAP头之前很长一段时间,您需要使用回调object...WebServiceMessageCallback构造xml节点

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42943996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档