Spring boot+CXF开发WebService Demo

目录

一、本次开发除了用到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());
     }
 }

  

 

posted @ 2021-02-09 15:27  编程我的一切  阅读(250)  评论(0编辑  收藏  举报