目录
一、本次开发除了用到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);
}
四、有了接口类,那么接下来我们对接口进行实现,也就是接口实现类(也就是业务类)代码:
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());
}
}