首先webservice 区分调用与提供
调用方式存在两种
1. 动态调用: 基于 使用 JaxWsDynamicClientFactory 调用接口
1import lombok.extern.slf4j.Slf4j; 2import org.apache.cxf.endpoint.Client; 3import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; 4@Slf4j 5public class WebserviceClientUtil { 6 public static String callWebSV(String wsdUrl, String operationName, String... params) throws Exception { 7 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); 8 Client client = dcf.createClient(wsdUrl); 9 //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD)); 10 Object[] objects; 11 // invoke("方法名",参数1,参数2,参数3....); 12 objects = client.invoke(operationName, params); 13 log.info("webservice返回数据: " + objects[0].toString()); 14 return objects[0].toString(); 15 } 16} 17 18 19 20import org.junit.jupiter.api.Test; 21 22public class WsdlTest { 23 @Test 24 public void t1() throws Exception { 25 String wsdUrl = "http://168.168.0.205/cidp/ws/xxServiceWSXML?wsdl"; 26 String methodName = "xxxModelDatasXMLWithVague"; 27 // 参数非必须填时, 但还是需要传入, 不能不传入 28 String[] parms = new String[]{"RY","","",""}; 29 String rtObj = WebserviceClientUtil.callWebSV(wsdUrl,methodName,parms); 30 System.out.println(rtObj); 31 } 32}
2.静态调用: 自己模拟生成接口提供方的接口及业务代码, 然后像调用本地方法一样直接调用
模拟生成接口: 使用cxf 插件, 根据wsdl 路径生成本地代码
1<plugin> 2 <groupId>org.apache.cxf</groupId> 3 <artifactId>cxf-codegen-plugin</artifactId> 4 <executions> 5 <execution> 6 <id>generate-sources</id> 7 <phase>generate-sources</phase> 8 <configuration> 9 <encoding>UTF-8</encoding> 10 <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> 11 <!--<sourceRoot>src/main/java</sourceRoot>--> 12 <defaultOptions> 13 <extraargs> 14 <extraarg>-impl</extraarg> 15 <extraarg>-verbose</extraarg> 16 <extraarg>-validate</extraarg> 17 <extraarg>-client</extraarg> 18 </extraargs> 19 </defaultOptions> 20 <wsdlOptions> 21 <wsdlOption> 22 <wsdl>http://168.168.0.205/cidp/ws/xx/ServiceWSXML?wsdl</wsdl> 23 <!--<wsdl>D:\code\Demo\src/main/resources/HVSService.wsdl</wsdl>--> 24 <extraargs> 25 <extraarg>-p</extraarg> 26 <extraarg>com.xx.xx.admin.wsdl</extraarg> 27 </extraargs> 28 </wsdlOption> 29 </wsdlOptions> 30 </configuration> 31 <goals> 32 <goal>wsdl2java</goal> 33 </goals> 34 </execution> 35 </executions> 36 </plugin>
引入后; install 下maven 项目 , 生成代码路径在target/generated 下
(即extaarg 设定的路径下) ; 复制生成的代码至项目代码中接口, 插件使用后, 即可注释
找到接口类, 不需要修改其他, 引用类, 像调用本地方法一样调用执行即可;
1import com.xx.xxx.admin.wsdl.XXXXServiceWSXML; 2import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 3import org.junit.jupiter.api.Test; 4 5public class WsdlTest { 6 @Test 7 public void t1(){ 8 System.out.println("请求开始----"); 9 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); 10 jaxWsProxyFactoryBean.setAddress("http://168.168.0.205/cidp/ws/xxxfsServiceWSXML"); 11 jaxWsProxyFactoryBean.setServiceClass(XXXsServiceWSXML.class); 12 XxxxsServiceWSXML demo = (XxxxsServiceWSXML) jaxWsProxyFactoryBean.create(); 13 String rtStr = demo.getDetail("RY","","",""); 14 System.out.println(rtStr); 15 16 System.out.println("请求结束"); 17 } 18 19 20 @Test 21 public void t2(){ 22 System.out.println("--------"); 23 } 24}
webservice 所需依赖
1<!-- webService --> 2 <!-- webservice cxf --> 3 <dependency> 4 <groupId>org.apache.cxf</groupId> 5 <artifactId>cxf-rt-frontend-jaxws</artifactId> 6 <version>3.1.6</version> 7 </dependency> 8 <dependency> 9 <groupId>org.apache.cxf</groupId> 10 <artifactId>cxf-rt-transports-http</artifactId> 11 <version>3.1.6</version> 12 </dependency> 13 <!-- // 第一个方式没有第三个依赖会报错 Cannot find any registered HttpDestinationFactory from the Bus.--> 14 <dependency> 15 <groupId>org.apache.cxf</groupId> 16 <artifactId>cxf-rt-transports-http-jetty</artifactId> 17 <version>3.1.6</version> 18 </dependency> 19 </dependencies>