WebService案例Springboot+CXF开发WebServiceDemo ⼀、本次开发除了⽤到spring boot基础jar包外,还⽤到了cxf相关jar包:
1 <!-- cxf⽀持 -->
2        <dependency>
3            <groupId>f</groupId>
4            <artifactId>cxf-rt-frontend-jaxws</artifactId>
5            <version>3.1.6</version>
6        </dependency>
7        <dependency>
8            <groupId>f</groupId>
9            <artifactId>cxf-rt-transports-http</artifactId>
10            <version>3.1.6</version>
11        </dependency>
⼆、⾸先我们创建⼀个实体类,内容是关于⽤户信息的查询和记录:
1 import java.io.Serializable;
2 import java.util.Date;
3
4 public class User implements Serializable {
5
6    private static final long serialVersionUID = -5939599230753662529L;
7    private String              userId;
8    private String            username;
9    private String            age;
10    private Date              updateTime;
11    //getter setter ......
12    public void setUserId(String userId) {
13        this.userId=userId;
14    }
15    public void setUsername(String username) {
16        this.username=username;
17    }
18    public void setAge(String age) {
19        this.age=age;
20    }
21    public void setUpdateTime(Date updateTime) {
22        this.updateTime=updateTime;
23    }
24
25
26    public String getUserId() {
27        return userId;
28    }
29    public String getUserName() {
30        return username;
31    }
32    public String getAge() {
33        return age;
34    }
35    public Date getUpdateTime() {
36        return updateTime;
37    }
38 }
三、接下来我们创建接⼝类:
1 import javax.jws.WebMethod;
2 import javax.jws.WebParam;
3 import javax.jws.WebService;
4
5 import cn.ity.User;
6
7
8 @WebService
9 public interface UserService {
10
11    @WebMethod
12    String getName(@WebParam(name = "userId") String userId);
13    @WebMethod
14    User getUser(String userId);
15 }
四、有了接⼝类,那么接下来我们对接⼝进⾏实现,也就是接⼝实现类(也就是业务类)代码:
1 package cn.paybay.demo.service.impl;
2
3 import java.util.Date;
4 import java.util.HashMap;
5 import java.util.Map;
6
7
8
9 import javax.jws.WebService;
10
11 import cn.ity.User;
12 import cn.paybay.demo.service.UserService;
13
14 @WebService(targetNamespace="service.demo.paybay/",endpointInterface = "cn.paybay.demo.service.UserService")
15 public class UserServiceImpl implements UserService{
16
17    private Map<String, User> userMap = new HashMap<String, User>();
18    public UserServiceImpl() {
19        System.out.println("向实体类插⼊数据");
20        User user = new User();
21        user.setUserId("411001");
22        user.setUsername("zhansan");
23        user.setAge("20");
24        user.setUpdateTime(new Date());
25        userMap.UserId(), user);
26
27        user = new User();
28        user.setUserId("411002");
29        user.setUsername("lisi");
30        user.setAge("30");
31        user.setUpdateTime(new Date());
32        userMap.UserId(), user);
33
34        user = new User();
35        user.setUserId("411003");
36        user.setUsername("wangwu");
37        user.setAge("40");
38        user.setUpdateTime(new Date());
39        userMap.UserId(), user);
40    }
41    @Override
42    public String getName(String userId) {
43        return "liyd-" + userId;
44    }
45    @Override
46    public User getUser(String userId) {
47        System.out.println("userMap是:"+userMap);
48        (userId);
49    }
50
51 }
注释(PS):在发布服务之前,我们要在这⾥对业务实现类进⾏⼀下说明,请⼤家看下图箭头指向的⽅框部分
(图⼀)
下⾯我来解释⼀下加上图⽅框箭头所指代码的⽬的:
impl.service.demo.paybay/:这是我的业务类所在路径;
service.demo.paybay/:这是我的接⼝类所在路径;
在不加上图⽅框箭头所指代码的情况下,你最后发服务的结果是这样的(如下图):
(图⼆)
并且会在你进⾏客户端调⽤的时候回报错:No operation was found with the name {impl.service.demo.paybay/}getUser.
那么原因就是:在CXF发布服务的时候,发布的是业务类(UserServiceImpl.java),那么默认的命名空间
就会是业务类所在包(路径),⽽对外界暴露的则是接⼝类(UserService.java),那么对于客户端调⽤的时侯,需要按照接⼝类所在路径进⾏命名空所以在发布之前我们要在业务类(UserServiceImpl.java)上增加注解,指定命名空间,然后再进⾏发布,
那么我们最终在加上(图⼀)⽅框箭头所指代码情况下,发布服务的结果为下图(请看图三):
(图三)
五、(发布服务)接⼝类,业务类代码都已经准备好,那么我接下来我就要对webservice服务进⾏发布:
代码如下:
1  2
3 l.ws.Endpoint;
4
5 import f.Bus;
6 import f.bus.spring.SpringBus;
7 import f.jaxws.EndpointImpl;
8 import f.transport.servlet.CXFServlet;
9 import org.springframework.boot.web.servlet.ServletRegistrationBean;
10 import t.annotation.Bean;
11 import t.annotation.Configuration;
12
13 import cn.paybay.demo.service.UserService;
14 import cn.paybay.demo.service.impl.UserServiceImpl;
15
16
17 @Configuration
18 public class TestConfig {
19
20          @Bean
21        public ServletRegistrationBean dispatcherServlet() {
22            return new ServletRegistrationBean(new CXFServlet(), "/test/*");
23        }
24        @Bean(name = Bus.DEFAULT_BUS_ID)
25        public SpringBus springBus() {
26            return new SpringBus();
27        }
28        @Bean
29        public UserService userService() {
30            return new UserServiceImpl();springframework jar包下载
31        }
32        @Bean
33        public Endpoint endpoint() {
34            EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
35            endpoint.publish("/user");
36            return endpoint;
37        }
38
39 }
那么到这⾥呢,我们的所有的步骤基本完成了,启动spring boot 然后再浏览器中输⼊url:localhost:8080/webservice/test/user?wsdl
可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。
那么这⾥我⼜要增加注释了,请⼤家注意,我在最初查询资料,配置demo的时候,启动以后,发布时候总是报404,⽹上有很多关于什么端⼝冲突等说法,我试过后,根本不是那⼀回事,然后我⽆意中尝试了⼀下,在url地址处加⼊⼯程名,结果,问因此请⼤家注意:在测试发布服务的时候,你在浏览器中输⼊的url地址应该是:localhost:8080/你的⼯程名/test/user?wsdl;
然后就是发布结果如下图(见图四):
(图四)
到此为⽌,我们的服务发布成功了。
六、调⽤服务
1  2
3
4
5
6 import dpoint.dynamic.JaxWsDynamicClientFactory;
7
8
9 public class Client {
10
12    public static void main(String args[]) throws Exception{
13
14        JaxWsDynamicClientFactory dcf =wInstance();
15        f.endpoint.Client client =ateClient("localhost:8080/webservice/test/user?wsdl");
16        //getUser 为接⼝中定义的⽅法名称张三为传递的参数返回⼀个Object数组
17        Object[] objects=client.invoke("getUser","411001");
18        //输出调⽤结果
19        System.out.println("*****"+objects[0].toString());
20    }
21
22 }
七、最后附上我的⼯程结构图(见图五):
(图五)
写这篇博客,参照了⼀些⼤神的贴⼦,学习到很多知识,总结出来的,仅供参考,如有错误,请各位指
导!本⽂原⽂地址:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。