springboot 客户端调用 webservice

本文详细介绍了如何在SpringBoot项目中通过Maven依赖引入并配置必要的WebService组件,包括CXF、Axis等,实现与远程WebService服务的交互。同时,针对可能遇到的异常和错误提供了具体的解决方案。

idea版本:2019.3.4

使用springboot 客户端调用 webservice

1 创建springboot项目/Maven项目[使用quickstar]

2 导入如下依赖

<dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- 邮件start -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <!-- CXF webservice -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.2.1</version>
        </dependency>

        <!-- axis 1.4 jar start -->
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-discovery</groupId>
            <artifactId>commons-discovery</artifactId>
            <version>0.2</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis-jaxrpc</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis-saaj</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.4</version>
        </dependency>

3在springboot项目中导入webservice地址

在这里插入图片描述

4 大功告成

在这里插入图片描述

4 此时导入之后肯能会报错

在这里插入图片描述
rebuild项目之后 刷新Maven依赖即可

5.测试时候可能会报错如下

org.apache.axis.ConfigurationException: No service named http://tempuri.org/

其实这个异常是可以忽略的,但是今天还傻乎乎盯着这个异常看,主要是之前没有记录一直被忽视了,这个异常是Axis自身的问题。

解决办法,只治标不治本。解决该问题的办法是,将这个异常的日志级别提高到INFO,在自己的LOG4J配置文件中添加如下配置:log4j.xml




log4j.properties
log4j.logger.org.apache.axis.ConfigurationException = INFO

Spring Boot 应用中实现动态调用 WebService 接口,通常需要结合动态代理技术(如 JDK 动态代理或 CGLIB)或使用 Apache CXF、JAX-WS RI 等框架来完成。动态调用的核心思想是不通过静态生成的客户端代码,而是通过反射机制或运行时生成的代理对象来调用远程 WebService 接口。 以下是一个基于 Apache CXF 实现动态调用 WebService 的示例: ### 1. 添加依赖 首先,在 `pom.xml` 中添加 Apache CXF 的依赖: ```xml <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter</artifactId> <version>4.0.0</version> </dependency> ``` ### 2. 创建动态调用工具类 使用 Apache CXF 提供的 `JaxWsDynamicClientFactory` 来实现动态调用: ```java import org.apache.cxf.jaxws.JaxWsDynamicClientFactory; import javax.xml.namespace.QName; import org.apache.cxf.endpoint.Client; public class DynamicWebServiceClient { public Object[] invoke(String wsdlUrl, String namespace, String serviceName, String operationName, Object... params) throws Exception { JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient(wsdlUrl, new QName(namespace, serviceName)); return client.invoke(new QName(namespace, operationName), params); } } ``` ### 3. 使用示例 假设要调用WebService 接口为 `http://example.com/FlightService?wsdl`,操作名为 `queryFlight`,参数为 `flightNumber`: ```java import org.springframework.stereotype.Service; @Service public class FlightService { private final DynamicWebServiceClient webServiceClient; public FlightService(DynamicWebServiceClient webServiceClient) { this.webServiceClient = webServiceClient; } public Object queryFlight(String flightNumber) throws Exception { String wsdlUrl = "http://example.com/FlightService?wsdl"; String namespace = "http://example.com/"; String serviceName = "FlightService"; String operationName = "queryFlight"; Object[] result = webServiceClient.invoke(wsdlUrl, namespace, serviceName, operationName, flightNumber); return result[0]; } } ``` ### 4. 控制器层调用 ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/flights") public class FlightController { private final FlightService flightService; public FlightController(FlightService flightService) { this.flightService = flightService; } @GetMapping("/{flightNumber}") public Object getFlightInfo(@PathVariable String flightNumber) throws Exception { return flightService.queryFlight(flightNumber); } } ``` ### 5. 动态调用的优势 - 支持运行时根据 WSDL 地址动态调用不同 WebService。 - 不需要提前生成客户端代码,适用于多租户或插件式架构。 - 可结合配置中心动态切换 WebService 地址和参数。 该方案适用于需要在运行时根据配置或用户输入动态决定调用哪个 WebService 的场景,例如在网关服务中动态转发请求到不同的后端 WebService 接口[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值