spring boot 下開發webservice介面
阿新 • • 發佈:2020-12-27
1、引入pom依賴
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.2.2</version> </dependency>
2、編寫webservice服務端
2.1 新建介面,並新增targetNamespace,targetNamespace是介面所在包的倒序,如果不新增,在動態呼叫介面的時候,會報錯誤資訊。
import javax.jws.WebParam; import javax.jws.WebService; // ~ File Information /** * @author yinyl * @date 2020年12月27日 下午2:45:10 * 類說明:定義介面,targetNamespace是當前所在包的倒序。*/ @WebService(targetNamespace="http://webservice.common.bmSystem.com") public interface IHelloWord { // ~ Methods public String say(@WebParam(name="helloName") String helloName); }
2.2 新建介面實現類,targetNamespace與實現介面保持一致,endpointInterface為介面所在包的全路徑
import javax.jws.WebService; import org.springframework.stereotype.Component;import com.bmSystem.common.webservice.IHelloWord; // ~ File Information /** * @author zxy * @date 2019年9月23日 下午2:46:18 * 類說明:介面實現類,targetNamespace是當前所在包的倒序。 */ @Component @WebService(targetNamespace="http://webservice.common.bmSystem.com", endpointInterface ="com.bmSystem.common.webservice.IHelloWord") public class HelloWordImpl implements IHelloWord{ @Override public String say(String str) { System.out.println("進入介面..."); return str; } }
3、釋出webservice介面
package com.bmSystem.common.sys.config.webservice; import javax.xml.ws.Endpoint; import org.apache.cxf.Bus; import org.apache.cxf.bus.spring.SpringBus; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.bmSystem.common.webservice.impl.HelloWordImpl; // ~ File Information /** * @author zxy * @date 2019年9月23日 下午3:12:00 * 類說明:webservice釋出,預設訪問地址為:localhost:8080/services/helloWord?wsdl * */ @Configuration public class WebServiceConfig { // ~ Fields @Autowired private HelloWordImpl helloWord;//介面實現類 // ~ Methods /** * 此方法作用是改變專案中服務名的字首名,此處127.0.0.1或者localhost不能訪問時,請使用ipconfig檢視本機ip來訪問 * 此方法被註釋後:wsdl訪問地址為http://127.0.0.1:8080/services/user?wsdl * 去掉註釋後:wsdl訪問地址為:http://127.0.0.1:8080/soap/user?wsdl * @return */ /* * @SuppressWarnings("all") * * @Bean public ServletRegistrationBean dispatcherServlet() { return new * ServletRegistrationBean(new CXFServlet(), "/soap/*"); } */ @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } @Bean public Endpoint endpoint() { EndpointImpl endpoint=new EndpointImpl(springBus(), helloWord); endpoint.publish("/helloWord");//訪問地址 return endpoint; } }
以上內容在實際運用中,已實現~
4、開發webservice客戶端呼叫,這裡採用的是動態呼叫方式(推薦)
import java.util.HashMap; import java.util.Map; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import com.google.gson.Gson; /** * @author zxy * @date 2020年6月5日 上午9:05:06 * @Description : 動態呼叫webservice介面 */ public class TestWebservice { public static void main(String[] args) { // 建立動態客戶端 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://127.0.0.1:8085/services/helloWord?wsdl"); // 需要密碼的情況需要加上使用者名稱和密碼 // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD)); Object[] objects = new Object[0]; try { // invoke("方法名",引數1,引數2,引數3....); //json的形式 Map<String,Object> params=new HashMap<String,Object>(); params.put("name", "dasda"); Gson gson = new Gson(); String json = gson.toJson(params); objects = client.invoke("say", json); System.out.println("返回資料:" + objects[0]); } catch (java.lang.Exception e) { e.printStackTrace(); } } }
axis方式呼叫webservice介面:
import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; public class Test01 { public static void main(String[] args) { try { //1、直接引用遠端的wsdl檔案 String endpoint = "介面訪問路徑"; Service service = new Service(); Call call = (Call) service.createCall(); //建立服務 call.setTargetEndpointAddress(endpoint); //2、定義報名和介面方法 call.setOperationName(new QName("targetNamespace", //wsdl檔案中的targetNamespace "getAllResourceDetail") //介面實現功能的方法 ); //3、設定引數 call.addParameter("resType", XMLType.XSD_INT,ParameterMode.IN);// 介面的引數 call.addParameter("nodeIndexCode",XMLType.XSD_STRING,ParameterMode.IN);// 介面的引數 call.setReturnType(XMLType.XSD_STRING);// 設定返回型別 int resType=1000; String nodeIndexCode=""; //4、給方法傳遞引數,並且呼叫方法 String result = (String) call.invoke(new Object[] {nodeIndexCode ,resType}); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }