惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
WordPress大学
WordPress大学
D
DataBreaches.Net
腾讯CDC
小众软件
小众软件
B
Blog RSS Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Y
Y Combinator Blog
V
V2EX
I
InfoQ
D
Docker
量子位
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
A
About on SuperTechFans
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
阮一峰的网络日志
阮一峰的网络日志
MyScale Blog
MyScale Blog

博客园 - 编程我的一切

避免大规模日志告警滞后的三种MySQL深度优化实战方案 如何平衡复杂度与扩展性:从过度设计到演进式架构的设计思考 从零开始:程序员快速上手大模型开发——从 Prompt Engineering 到 RAG 架构落地 深度解析:如何利用开源项目贡献构建高质量的个人技术品牌 打破成长瓶颈:程序员构建深度知识体系与高效学习的方法论 从慢查询到高并发:MySQL 索引优化与后端架构性能调优实战指南 从慢查询到高并发:MySQL 数据库性能调优的深度实践与核心策略 从零开始构建你的第一个 AI 应用:大模型 API 调用与 Prompt Engineering 实战指南 大模型时代下的开发者转型:从理论理解到 RAG 实战落地的进阶路径 从零开始构建你的 AI 助手:大模型本地部署与 Prompt 工程实战入门指南 从内存分配到零拷贝:深度解析 .NET 中 Span<T> 与 Memory<T> 的高性能实践 拒绝代码腐烂:深度解析代码整洁之道与高频重构模式 从“能跑就行”到“优雅之美”:深度解析代码整洁之道与重构实战技巧 Apache Hop实战:Windows平台MySQL数据迁移的深度排错与性能调优 线程与进程的区别与联系:操作系统入门详解(含 Python 示例) 打破同源枷锁:深入理解 postMessage 跨域通信机制 三大搜索引擎 URL 推送 API 详解:百度、必应、谷歌 PandasAI:当数据分析遇上自然语言处理 Windows 左ctrl和左alt键互换 Bootstrap下拉菜单、按钮式下拉菜单 SSM三大框架的运行流程、原理、核心技术详解 app启动速度怎么提升? canvas画布基本知识点总结 SSM框架整合(Spring + SpringMVC + MyBatis) Lambda入门 HTML5中的Web Notification桌面通知 Open3d之交互式可视化 行为识别TSM训练ucf101数据集 Python3列表、元组及之间的区别和转换 Java 字符串简介
Spring boot+CXF开发WebService Demo
编程我的一切 · 2021-02-09 · via 博客园 - 编程我的一切

目录

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