Java使用cxf發(fā)布及調(diào)用webservice接口的方法詳解
一、cxf發(fā)布webservice接口
添加maven依賴
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.4.3</version> </dependency>
這里的cxf-rt-transports-http-jetty依賴是內(nèi)置jetty容器發(fā)布webservice接口
創(chuàng)建服務(wù)端接口
@WebService public interface UserService { String getUserInfo(String name); }
@WebService public class UserServiceImpl implements UserService { @Override public String getUserInfo(String name) { return "我是" + name; } }
public class test { public static void main(String[] args) { System.out.println("web service start"); UserService implementor = new UserServiceImpl(); String address = "http://127.0.0.1:8082/userService"; JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); factoryBean.setAddress(address); // 設(shè)置暴露地址 factoryBean.setServiceClass(UserService.class); // 接口類 factoryBean.setServiceBean(implementor); // 設(shè)置實現(xiàn)類 factoryBean.create(); System.out.println("web service started"); System.out.println("web service started"); } }
啟動main方法,正常情況會發(fā)布成功
瀏覽器訪問http://127.0.0.1:8082/userService?wsdl 返回下面內(nèi)容說明發(fā)布成功
二、客戶端進行動態(tài)調(diào)用webservice接口
public static void main(String[] args) throws Exception { JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://127.0.0.1:8082/userService?wsdl"); // namespace是命名空間,methodName是方法名 QName name = new QName("http://service.test.example.com/", "getUserInfo"); Object[] objects = client.invoke(name, "我沒收到反饋"); System.out.println(objects[0].toString()); }
正常情況調(diào)用接口會返回成功
cxf的動態(tài)調(diào)用不適合傳遞自定義對象,需要傳遞自定義對象,需要使用靜態(tài)調(diào)用生成本地代碼
三、cxf靜態(tài)調(diào)用生成本地代碼
采用apache-cxf-3.4.3版本,jar包可到官網(wǎng)下載 http://cxf.apache.org/download.html
使用JAX-WS Proxy代理工廠方式開發(fā)客戶端,首先需要使用wsdl2java工具生成web service在本地的代理接口
1、配置環(huán)境變量
wsdl2java.bat在CXF根目錄\bin目錄下,使用之前需要配置CXF環(huán)境變量,CXF_HOME變量值為CXF根目錄,并在path中添加%CXF_HOME%\bin,如:
2、wsdl2java生成代理接口配置好環(huán)境變量后,打開CMD命令行窗口,將當(dāng)前目錄切換到j(luò)ava工程src目錄下,命令行輸入如下格式命令,回車,即可根據(jù)wsdl生成服務(wù)端的代理接口。
wsdl2java -p ws.cxf -client http://127.0.0.1:8082/userService?wsdl
命令說明:
-p 指定代理接口所在包名,-client(生成客戶端) 后面的字符串聲明了服務(wù)接口的wsdl
public static void test() { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(UserService.class); factory.setAddress("http://127.0.0.1:8082/userService"); Object object = factory.create(); UserService service = (UserService) object; UserVO userVO = new UserVO(); userVO.setName("李師傅打開"); String userInfo = service.getUserInfo(userVO); System.out.println(userInfo); }
3、第二種調(diào)用方法
ExecuteBindQSService executeBindQSService = new ExecuteBindQSService(ExecuteBindQSService.getWsdlLocation(WSDL_URL)); ExecutePtt executePtt = executeBindQSService.getExecuteBindQSPort(); //獲取代理,并設(shè)置日志攔截器,打印日志 Client client = ClientProxy.getClient(executePtt); client.getInInterceptors().add(new LoggingInInterceptor()); client.getOutInterceptors().add(new LoggingOutInterceptor()); // 超時時間設(shè)置 HTTPConduit http = (HTTPConduit) clientProxy.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(Integer .valueOf(webServiceConTimeout)); httpClientPolicy.setReceiveTimeout(Integer .valueOf(webServiceRevTimeout)); httpClientPolicy.setAllowChunking(false); http.setClient(httpClientPolicy); //調(diào)用方法執(zhí)行 Response response = executePtt.execute(request);
4、關(guān)閉元素校驗
@EndpointProperty(key = “soap.no.validate.parts”, value = “true”)
四、使用的是apache的axis實現(xiàn)的
第二種訪問webservice的方法是通過idea生成客戶端代碼,訪問服務(wù)端接口向訪問本地接口一樣。使用的是apache的axis實現(xiàn)的。
以上就是Java使用cxf發(fā)布及調(diào)用webservice接口的方法詳解的詳細內(nèi)容,更多關(guān)于Java 使用cxf調(diào)用webservice接口的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Postman form-data、x-www-form-urlencoded的區(qū)別及說明
這篇文章主要介紹了Postman form-data、x-www-form-urlencoded的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03Spring Cloud Gateway網(wǎng)關(guān)XSS過濾方式
這篇文章主要介紹了Spring Cloud Gateway網(wǎng)關(guān)XSS過濾方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10spring AOP的Around增強實現(xiàn)方法分析
這篇文章主要介紹了spring AOP的Around增強實現(xiàn)方法,結(jié)合實例形式分析了spring面向切面AOP的Around增強具體步驟與相關(guān)操作方法,需要的朋友可以參考下2020-01-01淺談Java中replace與replaceAll區(qū)別
這篇文章主要介紹了Java中replace與replaceAll區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Spring Boot 基于注解的 Redis 緩存使用詳解
本篇文章主要介紹了Spring Boot 基于注解的 Redis 緩存使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05詳解Java并發(fā)包中線程池ThreadPoolExecutor
ThreadPoolExecutor是Java語言對于線程池的實現(xiàn)。線程池技術(shù)使線程在使用完畢后不回收而是重復(fù)利用。如果線程能夠復(fù)用,那么我們就可以使用固定數(shù)量的線程來解決并發(fā)問題,這樣一來不僅節(jié)約了系統(tǒng)資源,而且也會減少線程上下文切換的開銷2021-06-06Spark學(xué)習(xí)筆記之Spark中的RDD的具體使用
這篇文章主要介紹了Spark學(xué)習(xí)筆記之Spark中的RDD的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06