rSpring marshalSendAndReceive genering empty SOAP response - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть конечная точка WSDL, которую я могу без проблем использовать, используя SoapUI, она работает. Чтобы использовать его, я должен установить basi c Аутентификация (превентивная аутентификация) .

Так что я пытаюсь создать для него простой Java (Spring Boot) клиент, я выполнил несколько шагов: https://spring.io/guides/gs/consuming-web-service/.

Запуск приложения , Он выдает NullpointerException, анализируя код, который я получил проблему (я думаю): конверт запроса абсолютно правильный (распечатка и копирование его в SoapUI, он работает), но ответ пуст, является пустым SOAP сообщением:

Response : 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body/></SOAP-ENV:Envelope>

Он выбрасывает следующий стек:

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) [spring-boot-2.1.12.RELEASE.jar:2.1.12.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:765) [spring-boot-2.1.12.RELEASE.jar:2.1.12.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:319) [spring-boot-2.1.12.RELEASE.jar:2.1.12.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.1.12.RELEASE.jar:2.1.12.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) [spring-boot-2.1.12.RELEASE.jar:2.1.12.RELEASE]
    at com.test.RMBasicWSDLClient.RmBasicWsdlClientApplication.main(RmBasicWsdlClientApplication.java:19) [classes/:na]
Caused by: java.lang.NullPointerException: null
    at com.test.RMBasicWSDLClient.RmBasicWsdlClientApplication.lambda$0(RmBasicWsdlClientApplication.java:33) [classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:781) [spring-boot-2.1.12.RELEASE.jar:2.1.12.RELEASE]
    ... 5 common frames omitted

Моя реализация (основная):

    @SpringBootApplication
    public class RmBasicWsdlClientApplication {

        public static void main(String[] args) {
            SpringApplication.run(RmBasicWsdlClientApplication.class, args);
        }

        @Bean
        CommandLineRunner lookup(SOAPConnector soapConnector) {

            return args -> {
            //Setting the request, it is working fine.
            RealizarConsultaSQL request = new RealizarConsultaSQL();
            request.setCodColigada(0);
            request.setCodSentenca(new ObjectFactory().createRealizarConsultaSQLCodSentenca("TESTE.WEBSERVICE"));    
            request.setCodSistema(new ObjectFactory().createRealizarConsultaSQLCodSistema("G"));
  //call to SOAPConnector class (where is marshalSendAndReceive(url, request) is located
            RealizarConsultaSQLResponse response = (RealizarConsultaSQLResponse) soapConnector.callWebService("http://myServer:8051/wsConsultaSQL/IwsConsultaSQL", request);

            //the Exception points to this line
            System.out.println("Name : "+response.getRealizarConsultaSQLResult());

        };
        }
    }

SOAPConnector (WebServiceGatewaySupport ) и перехватчик (ClientInterceptor) для отладки запроса / ответа:

    public class SOAPConnector extends WebServiceGatewaySupport {

        public Object callWebService(String url, Object request) {      

            ClientInterceptor[] interceptors = this.getInterceptors();

            interceptors = (ClientInterceptor[]) ArrayUtils.add(interceptors, new ClientInterceptor() {
                @Override
                public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
                    return true;
                }

                @Override
                public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
                    return true;
                }

                @Override
                public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
                    return true;
                }

                @Override
                public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
//debugging request/response (SOAP message)
                    try {
                        System.out.println("Request :");
                        messageContext.getRequest().writeTo(System.out);
                        System.out.println("\nResponse : ");
                        messageContext.getResponse().writeTo(System.out);
                        System.out.println();
                    } catch (IOException ignored) {
                        System.out.println(ignored.getMessage());
                    }
                }
            });

            this.setInterceptors(interceptors);     
            return getWebServiceTemplate().marshalSendAndReceive(url, request);
        }
    }

Класс конфигурации:

    @Configuration
    public class Config {

        @Value("${client.default-uri}")
        private String defaultUri;

        @Value("${client.user.name}")
        private String userName;

        @Value("${client.user.password}")
        private String userPassword;

        @Bean
        public Jaxb2Marshaller marshaller() {       
            Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
            marshaller.setContextPath("com.test.RMBasicWSDLClient.domain");                                
            return marshaller;
        }
        @Bean
        public SOAPConnector soapConnector (Jaxb2Marshaller marshaller) {       

        SOAPConnector client = new SOAPConnector();

            client.setMarshaller(marshaller);
            client.setUnmarshaller(marshaller);
            client.setDefaultUri("http://myServer:8051/wsConsultaSQL/IwsConsultaSQL");
            //setting the basic auth
            client.setMessageSender(httpComponentsMessageSender());
            return client;
        }

        //Methods to Set the Basic Auth

        @Bean
        public HttpComponentsMessageSender httpComponentsMessageSender() {
            HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
            httpComponentsMessageSender.setCredentials(usernamePasswordCredentials());      
            return httpComponentsMessageSender;
        }

        @Bean
        public UsernamePasswordCredentials usernamePasswordCredentials() {      
            return new UsernamePasswordCredentials(userName, userPassword);

    }
}

В soapUI, когда Auth пуст || Неверное имя пользователя / пароль. Возвращает сообщение Soap, содержащее «Неавторизованный»

. Я понятия не имею, почему ответ (сообщение SOAP) пуст, будет ли проблема с настройкой Auth?

...