使用 SOAP Web 服务错误(未注册编组器。检查 WebServiceTemplate 的配置)

Posted

技术标签:

【中文标题】使用 SOAP Web 服务错误(未注册编组器。检查 WebServiceTemplate 的配置)【英文标题】:Consuming a SOAP web service error (No marshaller registered. Check configuration of WebServiceTemplate) 【发布时间】:2018-06-01 20:08:42 【问题描述】:

我已经按照入门 - 使用 SOAP Web 服务 (https://spring.io/guides/gs/consuming-web-service/) 来使用特定的 Web 服务并且一切正常:

我已经做了配置类:

@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;
     

客户:

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;
    


在课堂上申请:

@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());
        ;
    

当我启动一个应用程序时,weservice 调用工作正常,所以我可以在控制台看到结果。我尝试使用相同的逻辑在其他类中调用此 Web 服务,但不起作用。比如我在Controller Class做了一个测试:

@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;

在这种情况下,Web 服务不起作用,系统显示以下错误消息:java.lang.IllegalStateException: No marshaller registered。检查 WebServiceTemplate 的配置。我不知道为什么,但是 web 服务在特定的地方工作而在另一个地方不工作。如果有人知道发生了什么,我很感激!谢谢!

【问题讨论】:

new ProcuraPMPorREClient(); 和 spring 使用完全配置的 bean 有什么区别... 哦,谢谢!我已经更改了 ProcuraPMPorREClient pm = new ProcuraPMPorREClient();到@Autowired ProcuraPMPorREClient pm,现在它正在工作!谢谢! 在这里遇到同样的问题,你能检查一下吗***.com/questions/50759580/… 【参考方案1】:

在这种情况下,我不能像我所做的那样在控制器中实例化一个新对象:

ProcuraPMPorREClient pm = new ProcuraPMPorREClient();

我需要创建一个@Autowired 对象,而不是这样:

@Autowired ProcuraPMPorREClient pm;

之后,我只调用相同的例程:

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

这很好用。

【讨论】:

这对我真的很有用@Murilo 我遇到了类似的问题。我也通过将客户端添加为 Autowired 来解决它。但是,我仍在寻找答案,为什么 main 使用 @SpringBootApplication 注释,为什么控制器启动的调用不起作用?

以上是关于使用 SOAP Web 服务错误(未注册编组器。检查 WebServiceTemplate 的配置)的主要内容,如果未能解决你的问题,请参考以下文章

Camel 的编组问题,无法正确编组 SOAP 请求?

报告查看器 Web 控制 HTTP 处理程序未在应用程序的 web.config 文件中注册

编写一个包装器将现有的 REST API 公开为 SOAP Web 服务?

未找到[SaajSoapMessage的端点映射,SOAP WS执行期间发生异常

Soap 错误:“服务器无法处理请求”“对象引用未设置为对象的实例”

如何使用 JAXB2 用动态元素编组 XML