【问题标题】:SoapFaultClientException: username and/or/password cannot be nullSoapFaultClientException:用户名和/或/密码不能为空
【发布时间】:2016-09-29 09:17:09
【问题描述】:

我已经构建了一个客户端,它应该从基于 wsdl 的远程 Web 服务(使用 SOAP)获取数据。

但每次我尝试连接(通过调用函数)与服务时,我都会收到以下异常:

org.springframework.ws.soap.client.SoapFaultClientException: Username and/or Password cannot be null
    at org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:38) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:826) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:621) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390) ~[spring-ws-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at com.test.adminUI.myPartners.client.MyPartnersServiceClient.sendSoapRequest(MyPartnersServiceClient.java:113) [bin/:na]
    at com.test.adminUI.myPartners.client.MyPartnersServiceClient.findUser(PartnersServiceClient.java:70) [bin/:na]...

如果我输入了错误的密码,例如服务注册了它,就会抛出 Unauthorized 401 ERROR 也就是说,它实际上验证了我的用户帐户详细信息。

我的客户:

public class MyServiceClient  extends WebServiceGatewaySupport {

    @Autowired
    private ObjectFactory factory;
    @Autowired
    private SoapProperties adProperties;

    private static final String WS_ADDRESSING_URI = "http://www.w3.org/2005/08/addressing";
    private static final String TO_TAG = "To";
    private static final String ACTION_TAG = "Action";
    private static final String WSA_PREFIX = "wsa";

    private static final String SOAP_ACTION_FIND_IFXPERSON = adProperties.getsoapURL();


    public List<Person> findUser(String email, String globalID) {
        List<Person> list = null;
        FindPerson findperson = new FindPerson();
        try {
            findperson.setGlobalID(factory.createGlobalID(globalID));

            findperson.setServiceUsername(factory.createServiceUsername(adProperties.getServiceUser()));
            findperson.setServicePassword(factory.createServicePassword(adProperties.getServicePassword()));


            FindPersonResponse response = (FindPersonResponse) sendSoapRequest(
                    SOAP_ACTION_FIND_PERSON, findperson);

            list = response.getFindPersonResult().getValue();
        } catch (Exception ex) {
            log.error("could not find Person: ", ex);
        }

        return null;
    }


    private Object sendSoapRequest(final String soapAction, Object payLoad) {

        Object response = null;

        try {
            Credentials auth = new NTCredentials(adProperties.getAuthUser(),
                    adProperties.getAuthPassword(), null, adProperties.getAuthDomain());

            HttpClientBuilder clientBuilder = HttpClientBuilder.create();

            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(AuthScope.ANY, auth);
            clientBuilder.setDefaultCredentialsProvider(credsProvider);

            RemoveSoapHeadersInterceptor interceptor = new RemoveSoapHeadersInterceptor();
            clientBuilder.addInterceptorFirst(interceptor);

            HttpClient httpClient = clientBuilder.build();

            HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
            messageSender.setHttpClient(httpClient);
            messageSender.setCredentials(auth);
            messageSender.afterPropertiesSet();

            getWebServiceTemplate().setMessageSender(messageSender);
            SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(
                    MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL));
            getWebServiceTemplate().setMessageFactory(messageFactory);

            response = getWebServiceTemplate().marshalSendAndReceive(
                    adProperties.getServiceEndpoint(), payLoad, new SoapActionCallback(soapAction) {

                        public void doWithMessage(WebServiceMessage message) {
                            try {
                                SaajSoapMessage soapMessage = (SaajSoapMessage) message;
                                SOAPMessage saajMessage = soapMessage.getSaajMessage();

                                SOAPEnvelope envelope = saajMessage.getSOAPPart().getEnvelope();
                                SOAPHeader header = envelope.getHeader();

                                QName wsaToQName = new QName(WS_ADDRESSING_URI, TO_TAG, WSA_PREFIX);
                                SOAPHeaderElement wsaTo = header.addHeaderElement(wsaToQName);
                                wsaTo.setTextContent(adProperties.getServiceEndpoint());

                                QName wsaActionQName = new QName(WS_ADDRESSING_URI, ACTION_TAG,
                                        WSA_PREFIX);
                                SOAPHeaderElement wsaAction = header
                                        .addHeaderElement(wsaActionQName);
                                wsaAction.setTextContent(soapAction);

                            } catch (Exception e) {
                                log.error("", e);
                            }
                        }
                    });
        } catch (Exception ex) {
            log.error(ex);
        }
        return response;
    }
}

配置:

@Configuration
public class MyPartnersServiceConfiguration {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setPackagesToScan("com.test.adminUI.myPartners.wsdl");
        return marshaller;
    }

    @Bean
    public IFXPartnersServiceClient iFXPartnersServiceClient(Jaxb2Marshaller marshaller) {
        IFXPartnersServiceClient client = new IFXPartnersServiceClient();
        client.setDefaultUri("http://test.idms.partnersservice");
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }

}

有人知道我要做什么吗?

提前致谢!

更新

我忘了提,我的控制台也收到了警告:

 o.a.http.impl.auth.HttpAuthenticator: NEGOTIATE authentication error: No valid credentials provided (Mechanism level: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt))

这是问题吗?在这种情况下我该怎么办?

【问题讨论】:

  • 所以你是说当你输入正确的凭据时服务不工作?
  • 是的。它说用户名或密码为空。但它不为空。
  • 尝试联系拥有此网络服务的人。看起来像服务器端问题。您还可以打印请求和响应,以便了解正在发送和接收的 xml。
  • 好的,谢谢。我试着问问拥有网络服务的人。

标签: web-services soap spring-boot soap-client


【解决方案1】:
   @Bean
public IFXPartnersServiceClient iFXPartnersServiceClient(Jaxb2Marshaller marshaller) {
    IFXPartnersServiceClient client = new IFXPartnersServiceClient();
    client.setDefaultUri("http://test.idms.partnersservice");
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);

 //Set messageSender to client
client.setMessageSender(httpComponentsMessageSender());

    return client;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多