目录
一、本次开发除了用到spring boot基础jar包外,还用到了cxf相关jar包:
二、首先我们创建一个实体类,内容是关于用户信息的查询和记录:
三、接下来我们创建接口类:
四、有了接口类,那么接下来我们对接口进行实现,也就是接口实现类(也就是业务类)代码:
五、(发布服务)接口类,业务类代码都已经准备好,那么我接下来我就要对webservice服务进行发布:
六、调用服务
一、本次开发除了用到spring boot基础jar包外,还用到了cxf相关jar包:
<!-- cxf支持 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.6</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.6</version> </dependency>
二、首先我们创建一个实体类,内容是关于用户信息的查询和记录:
import java.io.Serializable; import java.util.Date; public class User implements Serializable { private static final long serialVersionUID = -5939599230753662529L; private String userId; private String username; private String age; private Date updateTime; //getter setter ...... public void setUserId(String userId) { this.userId=userId; } public void setUsername(String username) { this.username=username; } public void setAge(String age) { this.age=age; } public void setUpdateTime(Date updateTime) { this.updateTime=updateTime; } public String getUserId() { return userId; } public String getUserName() { return username; } public String getAge() { return age; } public Date getUpdateTime() { return updateTime; } }
三、接下来我们创建接口类:
import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import cn.paybay.demo.entity.User; @WebService public interface UserService { @WebMethod String getName(@WebParam(name = "userId") String userId); @WebMethod User getUser(String userId); }
4、有了接口类,那么接下来我们对接口进行实现,也就是接口实现类(也就是业务类)代码:
package cn.paybay.demo.service.impl; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.jws.WebService; import cn.paybay.demo.entity.User; import cn.paybay.demo.service.UserService; @WebService(targetNamespace="http://service.demo.paybay.cn/",endpointInterface = "cn.paybay.demo.service.UserService") public class UserServiceImpl implements UserService{ private Map<String, User> userMap = new HashMap<String, User>(); public UserServiceImpl() { System.out.println("向实体类插入数据"); User user = new User(); user.setUserId("411001"); user.setUsername("zhansan"); user.setAge("20"); user.setUpdateTime(new Date()); userMap.put(user.getUserId(), user); user = new User(); user.setUserId("411002"); user.setUsername("lisi"); user.setAge("30"); user.setUpdateTime(new Date()); userMap.put(user.getUserId(), user); user = new User(); user.setUserId("411003"); user.setUsername("wangwu"); user.setAge("40"); user.setUpdateTime(new Date()); userMap.put(user.getUserId(), user); } @Override public String getName(String userId) { return "liyd-" + userId; } @Override public User getUser(String userId) { System.out.println("userMap是:"+userMap); return userMap.get(userId); } }
下面我来解释一下加上图方框箭头所指代码的目的: http://impl.service.demo.paybay.cn/:这是我的业务类所在路径; http://service.demo.paybay.cn/:这是我的接口类所在路径; 在不加上图方框箭头所指代码的情况下,你最后发服务的结果是这样的(如下图):
五、(发布服务)接口类,业务类代码都已经准备好,那么我接下来我就要对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.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import cn.paybay.demo.service.UserService; import cn.paybay.demo.service.impl.UserServiceImpl; @Configuration public class TestConfig { @Bean public ServletRegistrationBean dispatcherServlet() { return new ServletRegistrationBean(new CXFServlet(), "/test/*"); } @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } @Bean public UserService userService() { return new UserServiceImpl(); } @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), userService()); endpoint.publish("/user"); return endpoint; } }
那么到这里呢,我们的所有的步骤基本完成了,启动spring boot 然后再浏览器中输入url:http://localhost:8080/webservice/test/user?wsdl可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。那么这里我又要增加注释了,请大家注意,我在最初查询资料,配置demo的时候,启动以后,发布时候总是报404,网上有很多关于什么端口冲突等说法,我试过后,根本不是那一回事,然后我无意中尝试了一下,在url地址处加入工程名,结果,问题解决了。因此请大家注意:在测试发布服务的时候,你在浏览器中输入的url地址应该是:http://localhost:8080/你的工程名/test/user?wsdl;然后就是发布结果如下图(见图四):(图四)
到此为止,我们的服务发布成功了。
六、调用服务
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; public class Client { public static void main(String args[]) throws Exception{ JaxWsDynamicClientFactory dcf =JaxWsDynamicClientFactory.newInstance(); org.apache.cxf.endpoint.Client client =dcf.createClient("http://localhost:8080/webservice/test/user?wsdl"); //getUser 为接口中定义的方法名称 张三为传递的参数 返回一个Object数组 Object[] objects=client.invoke("getUser","411001"); //输出调用结果 System.out.println("*****"+objects[0].toString()); } }