javascript
SpringBoot集成webservice
前言
之前在工作中,有時候需要去對接第三方的醫院,而很多醫院的his系統用的都是老技術(WebService)。一直在對接webservice接口,卻不知道webservice接口是怎么實現的,這一次,我們來一探究竟。
這里吐槽一句,都什么年代了?還在用webservice?
WebService依賴什么?
跨語言和操作系統的遠程調用技術。比如亞馬遜,可以將自己的服務以webservice的服務形式暴露出來,我們就可以通過web調用這些,無論我們使用的語言是java還是c,這也是SOA應用一種表現形式。
WSDL(Web Service Description Language)將無論用何種語言書寫的web service描述出來,比如其參數或返回值。WSDL是服務端和客戶端都能解讀的標準格式。客戶端通過URL地址訪問到WSDL文件,在調用服務端之前先訪問WSDL文件。讀取到WSDL后通過客戶端的API類可以生成代理類,調用這些代理類就可以訪問webservice服務。代理類將客戶端的方法變為soap(Simple Object Access Protocal,可以理解為http+xml)格式通過http發送,同時接受soap格式的返回值并解析。
依賴
<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>創建實體類
/*** @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; }創建WebService接口
/*** @author Fang Ruichuan* @date 2022-11-14 19:03*/ public interface IUserServer {default UserDto getUser(Long str) {throw new RuntimeException("程序員正在馬不停蹄地開發新功能");} }創建WebService接口的實現類
/*** @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("上海市浦東新區").age(25).name("laJi").build();} }這里用到了注解@WebService,我這就只在實現類上使用了。這里介紹一下,先來看下它的定義:
@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: 對應wsdl:portType標簽,默認值為Java類或接口的名稱;
- targetNamespace: 命名空間,一般寫為接口的包名倒序,默認值也是接口的包名倒序。對應wsd:definitions:targetNamespace 標簽;
- serviceName: WebService的服務名稱,對應wsdl:service,默認值為WebService接口實現類的名稱+“Service”,示例:UserServiceImplServicce
- portName: 對應wsdl:port標簽,默認值為:WebService接口實現類的名稱+“Port”,示例:UserServiceImplPort
- wsdlLocation: 指定用于定義WebService的WSDL文檔的地址
- endpoointInterfacce: WebService接口全路徑
創建WebService配置類
@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;} }啟動服務:
進行訪問:http://localhost:8080/webservice
然后點擊url
客戶端
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":"上海市浦東新區","age":25,"id":99,"name":"laJi"}總結
以上是生活随笔為你收集整理的SpringBoot集成webservice的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLU58小票打印机win10驱动安装
- 下一篇: 关于c盘里的文件夹