龙空技术网

SpringBoot整合cxf发布webService和客户端的调用

字里藏宝 1490

前言:

眼前大家对“apachecxf接口怎么调用”大致比较注意,同学们都想要学习一些“apachecxf接口怎么调用”的相关文章。那么小编也在网络上搜集了一些对于“apachecxf接口怎么调用””的相关内容,希望我们能喜欢,同学们一起来了解一下吧!

SpringBoot整合cxf发布webService

1. 看看项目结构图

2. cxf的pom依赖

1 <dependency>2 <groupId>org.apache.cxf</groupId>3 <artifactId>cxf-spring-boot-starter-jaxws</artifactId>4 <version>3.2.4</version>5 </dependency>

3. 开始编写webService服务端

3.1 实体类entity

 1 package com.example.demo.entity; 2  3 import java.io.Serializable; 4 /** 5 * @ClassName:User 6 * @Description:测试实体 7 * @author Jerry 8 * @date:2018年4月10日下午3:57:38 9 */10 public class User implements Serializable{11 12 private static final long serialVersionUID = -3628469724795296287L;13 14 private String userId;15 private String userName;16 private String email;17 public String getUserId() {18 return userId;19 }20 public void setUserId(String userId) {21 this.userId = userId;22 }23 public String getUserName() {24 return userName;25 }26 public void setUserName(String userName) {27 this.userName = userName;28 }29 public String getEmail() {30 return email;31 }32 public void setEmail(String email) {33 this.email = email;34 }35 @Override36 public String toString() {37 return "User [userId=" + userId + ", userName=" + userName + ", email=" + email + "]";38 }39 40 }

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

3.2 服务接口

 1 package com.example.demo.service; 2  3 import javax.jws.WebMethod; 4 import javax.jws.WebParam; 5 import javax.jws.WebResult; 6 import javax.jws.WebService; 7  8 import com.example.demo.entity.User; 9 /**10 * @ClassName:UserService11 * @Description:测试服务接口类12 * include:两个测试方法13 * @author Jerry14 * @date:2018年4月10日下午3:58:1015 */16 //@WebService(targetNamespace="")如果不添加的话,动态调用invoke的时候,会报找不到接口内的方法,具体原因未知.17 @WebService(targetNamespace="")18 public interface UserService {19 20 @WebMethod//标注该方法为webservice暴露的方法,用于向外公布,它修饰的方法是webservice方法,去掉也没影响的,类似一个注释信息。21 public User getUser(@WebParam(name = "userId") String userId);22 23 @WebMethod24 @WebResult(name="String",targetNamespace="")25 public String getUserName(@WebParam(name = "userId") String userId);26 27 }

3.3 服务接口的实现类

 1 package com.example.demo.service.impl; 2  3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.UUID; 6  7 import javax.jws.WebService; 8  9 import org.springframework.stereotype.Component;10 11 import com.example.demo.entity.User;12 import com.example.demo.service.UserService;13 /**14 * @ClassName:UserServiceImpl15 * @Description:测试服务接口实现类16 * @author Jerry17 * @date:2018年4月10日下午3:58:5818 */19 @WebService(serviceName="UserService",//对外发布的服务名20 targetNamespace="",//指定你想要的名称空间,通常使用使用包名反转21 endpointInterface="com.example.demo.service.UserService")//服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口22 @Component23 public class UserServiceImpl implements UserService{24 25 private Map<String, User> userMap = new HashMap<String, User>();26 public UserServiceImpl() {27 System.out.println("向实体类插入数据");28 User user = new User();29 user.setUserId(UUID.randomUUID().toString().replace("-", ""));30 user.setUserName("test1");31 user.setEmail("Jerry@163.xom");32 userMap.put(user.getUserId(), user);33 34 user = new User();35 user.setUserId(UUID.randomUUID().toString().replace("-", ""));36 user.setUserName("test2");37 user.setEmail("Jerryfix@163.xom");38 userMap.put(user.getUserId(), user);39 40 user = new User();41 user.setUserId(UUID.randomUUID().toString().replace("-", ""));42 user.setUserName("test3");43 user.setEmail("Jerryfix@163.xom");44 userMap.put(user.getUserId(), user);45 }46 @Override47 public String getUserName(String userId) {48 return "userId为:" + userId;49 }50 @Override51 public User getUser(String userId) {52 System.out.println("userMap是:"+userMap);53 return userMap.get(userId);54 }55 56 }

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

3.4 发布webService的配置

 1 package com.example.demo.config; 2  3 import javax.xml.ws.Endpoint; 4  5 import org.apache.cxf.Bus; 6 import org.apache.cxf.jaxws.EndpointImpl; 7 import org.apache.cxf.transport.servlet.CXFServlet; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.web.servlet.ServletRegistrationBean;10 import org.springframework.context.annotation.Bean;11 import org.springframework.context.annotation.Configuration;12 13 import com.example.demo.service.UserService;14 /**15 * @ClassName:CxfConfig16 * @Description:cxf发布webservice配置17 * @author Jerry18 * @date:2018年4月10日下午4:12:2419 */20 @Configuration21 public class CxfConfig {22 @Autowired23 private Bus bus;24 25 @Autowired26 UserService userService;27 28 /**29 * 此方法作用是改变项目中服务名的前缀名,此处127.0.0.1或者localhost不能访问时,请使用ipconfig查看本机ip来访问30 * 此方法被注释后:wsdl访问地址为 * 去掉注释后:wsdl访问地址为: * @return33 */34 @SuppressWarnings("all")35 @Bean36 public ServletRegistrationBean dispatcherServlet() {37 return new ServletRegistrationBean(new CXFServlet(), "/soap/*");38 }39 40 /** JAX-WS 41 * 站点服务42 * **/43 @Bean44 public Endpoint endpoint() {45 EndpointImpl endpoint = new EndpointImpl(bus, userService);46 endpoint.publish("/user");47 return endpoint;48 }49 50 }

4. 项目启动后的wsdl信息

由于图省事,我将项目的服务端口改为了80,这样就省去了IP后面写端口号的麻烦。

5. 两种调用方式

 1 package com.example.demo.client; 2  3 import org.apache.cxf.endpoint.Client; 4 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 5 import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; 6  7 import com.example.demo.service.UserService; 8 /** 9 * @ClassName:CxfClient10 * @Description:webservice客户端:11 * 该类提供两种不同的方式来调用webservice服务12 * 1:代理工厂方式13 * 2:动态调用webservice14 * @author Jerry15 * @date:2018年4月10日下午4:14:0716 */17 public class CxfClient {18 19 20 public static void main(String[] args) {21 CxfClient.main1();22 CxfClient.main2();23 }24 25 /**26 * 1.代理类工厂的方式,需要拿到对方的接口地址27 */28 public static void main1() {29 try {30 // 接口地址31 String address = "";32 // 代理工厂33 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();34 // 设置代理地址35 jaxWsProxyFactoryBean.setAddress(address);36 // 设置接口类型37 jaxWsProxyFactoryBean.setServiceClass(UserService.class);38 // 创建一个代理接口实现39 UserService us = (UserService) jaxWsProxyFactoryBean.create();40 // 数据准备41 String userId = "maple";42 // 调用代理接口的方法调用并返回结果43 String result = us.getUserName(userId);44 System.out.println("返回结果:" + result);45 } catch (Exception e) {46 e.printStackTrace();47 }48 }49 50 /**51 * 2:动态调用52 */53 public static void main2() {54 // 创建动态客户端55 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();56 Client client = dcf.createClient("");57 // 需要密码的情况需要加上用户名和密码58 // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));59 Object[] objects = new Object[0];60 try {61 // invoke("方法名",参数1,参数2,参数3....);62 objects = client.invoke("getUserName", "maple");63 System.out.println("返回数据:" + objects[0]);64 } catch (java.lang.Exception e) {65 e.printStackTrace();66 }67 }68 }

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

6. 注意点.

诚如之前所说,如果接口的注解上不加targetNamespace的话,动态调用的时候,会报如下的错误。

标签: #apachecxf接口怎么调用