web-services - Web 服务传输异常 : Unauthorized [401] in Spring-WS

标签 web-services jakarta-ee spring-ws client-applications

我们正在努力配置我们的 Web 应用程序,以便能够通过 Spring WS 连接到 Web 服务。我们尝试使用客户端 Spring-WS 文档中的示例,但我们最终遇到了 WebServiceTransportException。 XML 配置如下所示:

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
    <constructor-arg ref="messageFactory"/>
    <property name="messageSender">
        <bean class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
            <property name="credentials">
                <bean class="org.apache.commons.httpclient.UsernamePasswordCredentials">
                    <constructor-arg value="john"/>
                    <constructor-arg value="secret"/>
                </bean>
            </property>
        </bean>
    </property>
</bean>

我们已经能够以编程方式配置应用程序,但是这种配置不可能“传输”到 Spring XML 配置,因为一些 setter 没有使用 Spring 期望的格式。 (HttpState.setCredentials(...) 有两个参数)。该配置是从公司的一些其他 Spring-WS 客户端代码中提取的。

这是有效的配置:

 public List<String> getAll() {
    List<String> carTypes = new ArrayList<String>();

    try {
        Source source = new ResourceSource(request);
        JDOMResult result = new JDOMResult();


        SaajSoapMessageFactory soapMessageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance());

        WebServiceTemplate template = new WebServiceTemplate(soapMessageFactory);

        HttpClientParams clientParams = new HttpClientParams();
        clientParams.setSoTimeout(60000);
        clientParams.setConnectionManagerTimeout(60000);
        clientParams.setAuthenticationPreemptive(true);

        HttpClient client = new HttpClient(clientParams);
        client.getState().setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("username", "password"));

        CommonsHttpMessageSender messageSender = new CommonsHttpMessageSender(client);

        template.setMessageSender(messageSender);
        template.sendSourceAndReceiveToResult(SERVICE_URI,
                source, result);

        // Handle the XML

    } catch (IOException e) {
        throw new RuntimeException(e);
    } catch (SOAPException e) {
        throw new RuntimeException(e);
    }

    return carTypes;
}

有谁知道如何解决我的问题?我在那里看到的每个教程都列出了第一个配置。似乎当我在 messageSender 对象上设置凭据时,它们只是被忽略了......

最佳答案

使用构造函数覆盖 HttpClient,该构造函数采用构造函数参数并通过 Spring 进行连接

public MyHttpClient(HttpClientParams params, UsernamePasswordCredentials usernamePasswordCredentials) {
        super(params);        
        getState().setCredentials(AuthScope.ANY, usernamePasswordCredentials);
    }

关于web-services - Web 服务传输异常 : Unauthorized [401] in Spring-WS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/115557/

相关文章:

java - ClassNotFoundException : javax. wsdl.extensions.ExtensibilityElement 错误

JAVA:通过 Jersey 进行分块传输

java - sun.reflect.annotation.TypeNotPresentExceptionProxy - 在 weblogic 上部署 SOAP web 服务

java - 日志中 pretty-print spring-ws SOAP 消息

java - 在 WebSphere 中对传入 SOAP 消息执行模式验证

.net - 调用不带 .asmx 扩​​展名的 IIS Web 服务

jakarta-ee - 使用共享库与完全封装的 EAR 的优缺点

java - JBoss 中的 EJB 特化

java - Spring WS 2.0.2 : Using StAX with @Endpoint

作为 jar 运行时的 spring-boot-starter-ws 性能