javascript
SpringBoot集成webservice
前言
之前在工作中,有時(shí)候需要去對(duì)接第三方的醫(yī)院,而很多醫(yī)院的his系統(tǒng)用的都是老技術(shù)(WebService)。一直在對(duì)接webservice接口,卻不知道webservice接口是怎么實(shí)現(xiàn)的,這一次,我們來(lái)一探究竟。
這里吐槽一句,都什么年代了?還在用webservice?
WebService依賴(lài)什么?
跨語(yǔ)言和操作系統(tǒng)的遠(yuǎn)程調(diào)用技術(shù)。比如亞馬遜,可以將自己的服務(wù)以webservice的服務(wù)形式暴露出來(lái),我們就可以通過(guò)web調(diào)用這些,無(wú)論我們使用的語(yǔ)言是java還是c,這也是SOA應(yīng)用一種表現(xiàn)形式。
WSDL(Web Service Description Language)將無(wú)論用何種語(yǔ)言書(shū)寫(xiě)的web service描述出來(lái),比如其參數(shù)或返回值。WSDL是服務(wù)端和客戶(hù)端都能解讀的標(biāo)準(zhǔn)格式。客戶(hù)端通過(guò)URL地址訪問(wèn)到WSDL文件,在調(diào)用服務(wù)端之前先訪問(wèn)WSDL文件。讀取到WSDL后通過(guò)客戶(hù)端的API類(lèi)可以生成代理類(lèi),調(diào)用這些代理類(lèi)就可以訪問(wèn)webservice服務(wù)。代理類(lèi)將客戶(hù)端的方法變?yōu)閟oap(Simple Object Access Protocal,可以理解為http+xml)格式通過(guò)http發(fā)送,同時(shí)接受soap格式的返回值并解析。
依賴(lài)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.3.4</version> </dependency>創(chuàng)建實(shí)體類(lèi)
/*** @author Fang Ruichuan* @date 2022-11-14 19:02*/ @Data @Builder public class UserDto {private Long id;private String name;private Integer age;private String address; }創(chuàng)建WebService接口
/*** @author Fang Ruichuan* @date 2022-11-14 19:03*/ public interface IUserServer {default UserDto getUser(Long str) {throw new RuntimeException("程序員正在馬不停蹄地開(kāi)發(fā)新功能");} }創(chuàng)建WebService接口的實(shí)現(xiàn)類(lèi)
/*** @author Fang Ruichuan* @date 2022-11-14 19:08*/ @Service @WebService public class UserServerImpl implements IUserServer {@Overridepublic UserDto getUser(Long id) {return UserDto.builder().id(id).address("上海市浦東新區(qū)").age(25).name("laJi").build();} }這里用到了注解@WebService,我這就只在實(shí)現(xiàn)類(lèi)上使用了。這里介紹一下,先來(lái)看下它的定義:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface WebService {String name() default "";String targetNamespace() default "";String serviceName() default "";String portName() default "";String wsdlLocation() default "";String endpointInterface() default ""; }- name: 對(duì)應(yīng)wsdl:portType標(biāo)簽,默認(rèn)值為Java類(lèi)或接口的名稱(chēng);
- targetNamespace: 命名空間,一般寫(xiě)為接口的包名倒序,默認(rèn)值也是接口的包名倒序。對(duì)應(yīng)wsd:definitions:targetNamespace 標(biāo)簽;
- serviceName: WebService的服務(wù)名稱(chēng),對(duì)應(yīng)wsdl:service,默認(rèn)值為WebService接口實(shí)現(xiàn)類(lèi)的名稱(chēng)+“Service”,示例:UserServiceImplServicce
- portName: 對(duì)應(yīng)wsdl:port標(biāo)簽,默認(rèn)值為:WebService接口實(shí)現(xiàn)類(lèi)的名稱(chēng)+“Port”,示例:UserServiceImplPort
- wsdlLocation: 指定用于定義WebService的WSDL文檔的地址
- endpoointInterfacce: WebService接口全路徑
創(chuàng)建WebService配置類(lèi)
@Configuration @RequiredArgsConstructor public class CxfConfig {private final IUserServer userServer;/*** 注入Servlet,注意beanName不能為dispatcherServlet* @author Fang Ruichuan* @date 2022/11/14 19:16*/@Beanpublic ServletRegistrationBean cxfServlet() {return new ServletRegistrationBean(new CXFServlet(), "/webservice/*");}@Bean(name = Bus.DEFAULT_BUS_ID)public SpringBus springBus() {return new SpringBus();}@Beanpublic Endpoint endpoint() {EndpointImpl endpoint = new EndpointImpl(springBus(), userServer);endpoint.publish("/api");return endpoint;} }啟動(dòng)服務(wù):
進(jìn)行訪問(wèn):http://localhost:8080/webservice
然后點(diǎn)擊url
客戶(hù)端
public class WebserviceClient {public static void main(String[] args) {JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();Client client = dcf.createClient("http://localhost:8080/webservice/api?wsdl");final ObjectMapper mapper = new ObjectMapper();try {Object[] objects = client.invoke("getUser", 99L);System.out.println(mapper.writeValueAsString(objects[0]));} catch (Exception e) {e.printStackTrace();;}} }顯示:
{"address":"上海市浦東新區(qū)","age":25,"id":99,"name":"laJi"}總結(jié)
以上是生活随笔為你收集整理的SpringBoot集成webservice的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: BLU58小票打印机win10驱动安装
- 下一篇: SpringBoot中属性映射之开启驼峰