У меня есть конечная точка 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?