springboot 整合webservice 相关说明
1.环境依赖 jdk8, springboot 2.3.12.release,cxf版本需要根据springboot版本修改,方法:查看springboot版本的发布日期,然后根据日期找相近的两个版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.12.RELEASE</version>
</dependency> <dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.4.5</version>
</dependency>
2. WebserviceConfig.java


1 package com.example.demo.demos.nacosconfig;
2
3 import javax.xml.ws.Endpoint;
4
5 import org.apache.cxf.bus.spring.SpringBus;
6 import org.apache.cxf.jaxws.EndpointImpl;
7 import org.apache.cxf.transport.servlet.CXFServlet;
8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.boot.web.servlet.ServletRegistrationBean;
10 import org.springframework.context.annotation.Bean;
11 import org.springframework.context.annotation.Configuration;
12
13 import com.example.demo.demos.webservice.IUserWebService;
14
15 @Configuration
16 public class WebServiceConfig {
17
18 /************* 要发布的webservice,需要有对应的实现类,建议参照下文中的命名规范 ****************/
19 @Autowired
20 private IUserWebService webService;
21
22 @SuppressWarnings({ "rawtypes", "unchecked" })
23 @Bean
24 public ServletRegistrationBean cxfServlet() {
25 return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
26 }
27
28 @Bean
29 public SpringBus cxf() {
30 return new SpringBus();
31 }
32
33 @Bean
34 public Endpoint endpoint() {
35 EndpointImpl endpoint = new EndpointImpl(cxf(), webService);
36 endpoint.publish("/api");
37 return endpoint;
38 }
39 }
3. 接口示例和规范


1 package com.example.demo.demos.webservice;
2
3 import javax.jws.WebMethod;
4 import javax.jws.WebService;
5
6 /**
7 * name决定了生成的相关调用代码是否简单明了且符合上下文语境<br/>
8 * targetNamespace 无所谓,和实现类一致即可
9 * @author Administrator
10 *
11 */
12 @WebService(name = "userService", targetNamespace = "https://www.demo.tech")
13 public interface IUserWebService {
14
15 @WebMethod
16 public String sayHello(String name);
17 }
4.实现类


1 package com.example.demo.demos.webservice.impl;
2
3 import javax.jws.WebService;
4
5 import org.springframework.stereotype.Component;
6
7 import com.example.demo.demos.webservice.IUserWebService;
8
9 /**
10 *
11 * class 类名如下,去掉接口中的首字母'I'和结尾单词'Service'<br/>
12 * 生成的调用代码语境就比较通顺
13 *
14 * @author Administrator
15 *
16 */
17 @Component
18 @WebService(targetNamespace = "https://www.demo.tech", endpointInterface = "com.example.demo.demos.webservice.IUserWebService")
19 public class UserWeb implements IUserWebService {
20
21 public String sayHello(String name) {
22 return String.format("hello,%s", name);
23 }
24 }
5. 打开要生成的文件夹,即生成的代码要保存到哪里就打开哪个文件夹,然后运行命令 wsimport -encoding UTF-8 -s . http://127.0.0.1:8080/ws/api?wsdl 自动生成java相关代码
6. 测试代码就会变得语境通顺


1 package com.example.demo;
2
3 import java.net.MalformedURLException;
4 import java.net.URL;
5
6 import javax.xml.namespace.QName;
7 import javax.xml.ws.Service;
8
9 import https.www_zqxx.UserService;
10
11 public class WebServiceTest {
12 public static void main(String[] args) throws MalformedURLException {
13 System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");
14 // 创建WSDL的URL
15 URL url = new URL("http://localhost:8080/ws/api?wsdl");
16 // 指定命名空间和服务名称
17 QName qName = new QName("https://www.demo.tech", "UserWebService");
18 Service service = Service.create(url, qName);
19 // 通过getPort方法返回指定接口
20 UserService userService = service.getPort(UserService.class);
21 String res = userService.sayHello("小明");
22 System.out.println(res);
23 }
24 }
7. 统一封装结果类


package com.zqxxjs.v1.common; import java.util.List; import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "ResponseEntity")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "code", "msg", "result" })
public class ResponseEntity<T> { private Integer code;
private String msg; private Message<T> result; public Integer getCode() {
return code;
} public void setCode(Integer code) {
this.code = code;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} public Message<T> getResult() {
return result;
} public void setResult(Message<T> result) {
this.result = result;
} public static <E> ResponseEntity<E> success(List<E> data, Long count) {
ResponseEntity<E> entity = new ResponseEntity<>();
entity.setCode(Constant.SUCCESS_CODE);
entity.setMsg(Constant.SUCCESS_MSG);
Message<E> resultTmp = new Message<>();
resultTmp.setCount(count);
resultTmp.setData(data);
entity.setResult(resultTmp);
return entity;
} }
8. 配合mbg插件,在生成的实体类上边要加的相关注解,注解生成工具:


package com.zqxxjs.order.common; import java.io.File;
import java.lang.reflect.Field;
import java.util.Collection; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils; public class XmlUtil {
public static void main(String[] args) throws Exception {
String packageName="com.zqxxjs.order.entity";
String path = Thread.currentThread().getContextClassLoader().getResource(packageName.replace(".", "/")).getPath();
Collection<File> entityClassFile = FileUtils.listFiles(new File(path), new String[] { "class" }, false);
for (File file : entityClassFile) {
if (file.getName().contains("Example")) {
continue;
}
Class<?> c = Class.forName(packageName+"." + FilenameUtils.getBaseName(file.getName()));
Field[] fds = c.getDeclaredFields();
String s = ("@XmlType(propOrder = { ");
String[] tmp = new String[fds.length - 1];
for (int i = 0; i < tmp.length; i++) {
Field f = fds[i];
if (f.getName().equalsIgnoreCase("serialVersionUID")) {
continue;
} tmp[i] = String.format("\"%s\"", f.getName());
} System.out.println("\n\n@XmlRootElement(name = \""+c.getSimpleName()+"\")");
System.out.println("@XmlAccessorType(XmlAccessType.FIELD)");
s = s.concat(String.join(",", tmp)).concat("})");
System.out.println(s);
System.out.println("-----------------------------------------------------------------");
} }
}
9. 加好后的示例代码


package com.zqxxjs.v1.entity; import java.io.Serializable;
import java.math.BigDecimal; import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; /**
*
* This class was generated by MyBatis Generator. This class corresponds to the
* database table finance_account_info
*/ @XmlRootElement(name = "FinanceAccountInfo")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "id", "serialNumber", "projectNumber", "projectName", "director", "amountOfMoney", "createDate",
"financeNumber", "remark" })
public class FinanceAccountInfo implements Serializable {
/**
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.id
*
* @mbg.generated
*/
private Integer id; /**
* Database Column Remarks: 流水号
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.serial_number
*
* @mbg.generated
*/
private String serialNumber; /**
* Database Column Remarks: 项目编号
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.project_number
*
* @mbg.generated
*/
private String projectNumber; /**
* Database Column Remarks: 项目名称
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.project_name
*
* @mbg.generated
*/
private String projectName; /**
* Database Column Remarks: 负责人
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.director
*
* @mbg.generated
*/
private String director; /**
* Database Column Remarks: 金额
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.amount_of_money
*
* @mbg.generated
*/
private BigDecimal amountOfMoney; /**
* Database Column Remarks: 往来日期
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.create_date
*
* @mbg.generated
*/
private String createDate; /**
* Database Column Remarks: 财务编号
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.finance_number
*
* @mbg.generated
*/
private String financeNumber; /**
* Database Column Remarks: 备注
*
* This field was generated by MyBatis Generator. This field corresponds to the
* database column finance_account_info.remark
*
* @mbg.generated
*/
private String remark; /**
* This field was generated by MyBatis Generator. This field corresponds to the
* database table finance_account_info
*
* @mbg.generated
*/
private static final long serialVersionUID = 1L; /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.id
*
* @return the value of finance_account_info.id
*
* @mbg.generated
*/
public Integer getId() {
return id;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.id
*
* @param id the value for finance_account_info.id
*
* @mbg.generated
*/
public void setId(Integer id) {
this.id = id;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.serial_number
*
* @return the value of finance_account_info.serial_number
*
* @mbg.generated
*/
public String getSerialNumber() {
return serialNumber;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.serial_number
*
* @param serialNumber the value for finance_account_info.serial_number
*
* @mbg.generated
*/
public void setSerialNumber(String serialNumber) {
this.serialNumber = serialNumber;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.project_number
*
* @return the value of finance_account_info.project_number
*
* @mbg.generated
*/
public String getProjectNumber() {
return projectNumber;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.project_number
*
* @param projectNumber the value for finance_account_info.project_number
*
* @mbg.generated
*/
public void setProjectNumber(String projectNumber) {
this.projectNumber = projectNumber;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.project_name
*
* @return the value of finance_account_info.project_name
*
* @mbg.generated
*/
public String getProjectName() {
return projectName;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.project_name
*
* @param projectName the value for finance_account_info.project_name
*
* @mbg.generated
*/
public void setProjectName(String projectName) {
this.projectName = projectName;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.director
*
* @return the value of finance_account_info.director
*
* @mbg.generated
*/
public String getDirector() {
return director;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.director
*
* @param director the value for finance_account_info.director
*
* @mbg.generated
*/
public void setDirector(String director) {
this.director = director;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.amount_of_money
*
* @return the value of finance_account_info.amount_of_money
*
* @mbg.generated
*/
public BigDecimal getAmountOfMoney() {
return amountOfMoney;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.amount_of_money
*
* @param amountOfMoney the value for finance_account_info.amount_of_money
*
* @mbg.generated
*/
public void setAmountOfMoney(BigDecimal amountOfMoney) {
this.amountOfMoney = amountOfMoney;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.create_date
*
* @return the value of finance_account_info.create_date
*
* @mbg.generated
*/
public String getCreateDate() {
return createDate;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.create_date
*
* @param createDate the value for finance_account_info.create_date
*
* @mbg.generated
*/
public void setCreateDate(String createDate) {
this.createDate = createDate;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.finance_number
*
* @return the value of finance_account_info.finance_number
*
* @mbg.generated
*/
public String getFinanceNumber() {
return financeNumber;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.finance_number
*
* @param financeNumber the value for finance_account_info.finance_number
*
* @mbg.generated
*/
public void setFinanceNumber(String financeNumber) {
this.financeNumber = financeNumber;
} /**
* This method was generated by MyBatis Generator. This method returns the value
* of the database column finance_account_info.remark
*
* @return the value of finance_account_info.remark
*
* @mbg.generated
*/
public String getRemark() {
return remark;
} /**
* This method was generated by MyBatis Generator. This method sets the value of
* the database column finance_account_info.remark
*
* @param remark the value for finance_account_info.remark
*
* @mbg.generated
*/
public void setRemark(String remark) {
this.remark = remark;
}
}
springboot 整合webservice 相关说明的更多相关文章
- Springboot整合webservice
Springboot整合webservice 2019-12-10 16:34:42 星期二 WebService是什么 WebService是一种跨编程语言和跨操作系统平台的远程调用技术,服务之间的 ...
- springboot整合WebService简单版
一.什么是webservice 关于webservice的介绍摘自百度百科,上面的介绍很详细.(链接:https://baike.baidu.com/item/Web%20Service/121503 ...
- springboot整合webservice采用CXF技术
转载自:https://blog.csdn.net/qq_31451081/article/details/80783220 强推:https://blog.csdn.net/chjskarl/art ...
- 【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)
1 分布式追踪系统 随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了.架构更复杂.应用更多,要从中快速诊断出问题.找到性能瓶颈,并不是一件容易的事.因此,也随着诞生了一系列面向Dev ...
- springboot配置server相关配置&整合模板引擎Freemarker、thymeleaf&thymeleaf基本用法&thymeleaf 获取项目路径 contextPath 与取session中信息
1.Springboot配置server相关配置(包括默认tomcat的相关配置) 下面的配置也都是模板,需要的时候在application.properties配置即可 ############## ...
- 很详细的SpringBoot整合UEditor教程
很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...
- SpringBoot整合Apache-CXF实践
一.Apache CXF是什么? Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS . ...
- SpringBoot整合Redis、ApachSolr和SpringSession
SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- SpringBoot整合Kafka和Storm
前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...
随机推荐
- Linux管理SpringBoot应用shell脚本实现
Liunx系统如何部署和管理SpringBoot项目应用呢?最简单的方法就是写个shell脚本. Spring Boot是Java的一个流行框架,用于开发企业级应用程序.下面我们将学习如何在Lin ...
- Spring5课堂笔记
Spring5 1..Spring 1.1.简介 Spring --> 春天,为开源软件带来了春天 2002,首次推出了Spring框架的雏形:interface21框架! Spring框架以i ...
- Mybatis分页插件有效范围
一.问题由来 在修改了一段代码后,将修改后的功能放在测试环境简单测试后,发现没有任何问题,因为测试环境数据量非常少(10条以下),因此 也就没有怀疑修改的代码存在问题,直接上生产环境,测试的时候发现后 ...
- C#实现一个简单的日志类
目录 自定义日志类 NLog版本的日志类 Serilog版本的日志类 上个月换工作,新项目又要重新搭建基础框架,把日志实现部分单独记录下来方便以后参考. 自定义日志类 代码大部分使用ChatGPT生成 ...
- 什么是k8s中的sidecar模式
在Kubernetes中,Sidecar模式是一种将辅助容器与主应用程序容器一起部署在同一个Pod中的设计模式.这种模式的目的是将辅助功能与主应用程序解耦,并提供独立发布.能力重用以及共享资源和网络的 ...
- PlayBook 详解
4)Playbook 4.1)Playbook 介绍 PlayBook 与 ad-hoc 相比,是一种完全不同的运用 Ansible 的方式,类似与 Saltstack 的 state 状态文件.ad ...
- 谷歌Linux 运维工程师面试真题
谷歌Linux 运维工程师面试真题 下面是谷歌 Linux 运维工程师面试真题: 1.如何查看当前的 Linux 服务器的运行级别? 答: 'who -r' 和 'runlevel' 命令可以用来查看 ...
- python高级技术(网络编程二)
一 粘包现象(基于TCP协议实现远程执行命令) 1.TCP协议,会出现粘包现象 例:ipconfig命令,客户端收到的字符串比较短,客户端能够收完整, tasklist命令,客户端收到的字符串超过10 ...
- exist和left join 性能对比
今天遇到一个性能问题,再调优过程中发现耗时最久的计划是exist 部分涉及的三个表. 然后计划用left join 来替换exist,然后查询了很多资料,大部分都说exist和left join 性能 ...
- KingbaseES 的角色和权限管理
KingbaseES使用角色的概念管理数据库访问权限.为了方便权限管理,用户可以建立多个角色,对角色进行授权和权限回收,并把角色授予其他用户. 数据库初始化时,会创建一个超级用户的角色:system( ...