7 votes

Erreur de consommation d'un service web SOAP (Aucun marshaller enregistré. Vérifiez la configuration de WebServiceTemplate)

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 !

11voto

Dans ce cas, je ne peux pas instancier un nouvel objet dans le contrôleur comme je l'ai fait :

ProcuraPMPorREClient pm = new ProcuraPMPorREClient();

Au lieu de cela, je dois créer un objet @Autowired, comme ceci :

@Autowired ProcuraPMPorREClient pm;

Après, je n'appelle que les mêmes routines :

ProcuraPMPorREResponse response = pm.getPMPorRE(123456); 
System.out.println(response.getProcuraPMPorREResult().getNomePM());

Cela a bien fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X