J'ai suivi le guide "Démarrage - Consommer un service web SOAP" ( https://spring.io/guides/gs/consuming-web-service/ ) pour consommer un service web spécifique et tout fonctionne bien :
J'ai créé la classe de configuration :
@Configuration
public class PMConfiguration {
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// this package must match the package in the <generatePackage> specified in
// pom.xml
marshaller.setContextPath("com.inteligenciaweb.wsdl");
return marshaller;
}
@Bean
public ProcuraPMPorREClient procuraPMPorREClient(Jaxb2Marshaller marshaller) {
ProcuraPMPorREClient client = new ProcuraPMPorREClient();
client.setDefaultUri("http://tempuri.org/procuraPMPorRE");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
return client;
}
}
Client :
public class ProcuraPMPorREClient extends WebServiceGatewaySupport {
private static final Logger log = LoggerFactory.getLogger(ProcuraPMPorRE.class);
public ProcuraPMPorREResponse getPMPorRE(Integer RE) {
ProcuraPMPorRE request = new ProcuraPMPorRE();
request.setPMRENum(RE);
log.info("Requesting PM for " + RE);
ProcuraPMPorREResponse response = (ProcuraPMPorREResponse) getWebServiceTemplate()
.marshalSendAndReceive("http://webservices.externo.policiamilitar.sp.gov.br:8071/router/wsscpm/basic",
request,
new SoapActionCallback("http://tempuri.org/procuraPMPorRE"));
return response;
}
}
A la classe Application :
@SpringBootApplication
public class InteligenciawebApplication {
public static void main(String[] args) {
SpringApplication.run(InteligenciawebApplication.class, args);
}
@Bean
CommandLineRunner lookup(ProcuraPMPorREClient pm) {
return args -> {
Integer re = 123456;
ProcuraPMPorREResponse response = pm.getPMPorRE(re);
System.err.println(response.getProcuraPMPorREResult().getNomeBancoPM());
};
}
}
Lorsque je lance une application, l'appel au weservice fonctionne bien, et je peux voir le résultat dans la console. J'ai essayé d'utiliser la même logique pour appeler ce service web dans d'autres classes, mais cela ne fonctionne pas. Par exemple, j'ai fait un test dans la classe Controller :
@RequestMapping(value = "/soap", method = RequestMethod.GET)
public String testeSoap() {
ProcuraPMPorREClient pm = new ProcuraPMPorREClient();
ProcuraPMPorREResponse response = pm.getPMPorRE(123456);
System.out.println(response.getProcuraPMPorREResult().getNomePM());
return null;
}
Dans ce cas, le webservice ne fonctionne pas et le système affiche ce message d'erreur : java.lang.IllegalStateException : Aucun marshaller enregistré. Vérifiez la configuration de WebServiceTemplate. Je ne sais pas pourquoi, mais le webservice fonctionne à un endroit spécifique et ne fonctionne pas à l'autre. Si quelqu'un sait ce qui se passe, je l'en remercie ! Merci !