SpringBoot整合WebService(实用版)

SpringBoot整合WebService

简介

WebService就是一种跨编程语言和跨操作系统平台的远程调用技术

此处就不赘述WebService相关概念和原理了,可以参考:https://blog.csdn.net/c99463904/article/details/76018436

代码示例

此处共分两个端,客户端和服务端,一个负责调用接口,一个负责创建接口并实现

首先创建一个Maven父项目,在pom.xml文件中引入SpringBoot坐标

<parent>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-parent</artifactid>
    <version>2.5.0</version>
    <relativepath> <!-- lookup parent from repository -->
</relativepath></parent>

Server搭建

在父项目中创建服务端(Server)子项目,

pom.xml文件,引入以下坐标

<dependencies>
    <dependency>
        <groupid>org.apache.cxf</groupid>
        <artifactid>cxf-spring-boot-starter-jaxws</artifactid>
        <version>3.2.5</version>
    </dependency>
    <!--    不引入会报错  报接口未实现  -->
    <dependency>
        <groupid>org.hibernate</groupid>
        <artifactid>hibernate-validator</artifactid>
        <version>6.0.18.Final</version>
    </dependency>

    <dependency>
        <groupid>org.projectlombok</groupid>
        <artifactid>lombok</artifactid>
    </dependency>
</dependencies>

启动类(引导类)

@SpringBootApplication
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class,args);
    }

}

User.java

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private String name;

    private Integer age;

}

UserService接口

@WebService(targetNamespace = "wsdl.aerfazhe.com",name = "userPortType")
public interface UserService {

    @WebMethod
    User getUserName(@WebParam(name = "name") String name);

}

UserService实现类

@WebService(
        targetNamespace = "wsdl.aerfazhe.com", //&#x547D;&#x540D;&#x7A7A;&#x95F4; &#x6307;&#x5B9A;wsdl&#x8BF4;&#x660E;&#x4E66;&#x5728;Client&#x7AEF;&#x6240;&#x5B58;&#x653E;&#x7684;&#x5305;&#x8DEF;&#x5F84;&#x4E3A;com.aerfazhe.wsdl&#x5305;&#x4E0B;
        name = "userPortType",
        serviceName = "userService", //&#x670D;&#x52A1;Name&#x540D;&#x79F0;
        portName = "userPortName",
        endpointInterface = "com.aerfazhe.service.UserService" // &#x6307;&#x5B9A;webService&#x7684;&#x63A5;&#x53E3;&#x7C7B;&#xFF0C;&#x6B64;&#x7C7B;&#x4E5F;&#x9700;&#x8981;&#x63A5;&#x5165;@WebService&#x6CE8;&#x89E3;
)
public class UserServiceImpl implements UserService {

    @Override
    public User getUserName(String name) {
        User user = new User(name, 28);
        return user;
    }

}

配置类

@Configuration
public class CxfWebServiceConfig {

    @Bean("cxfServletRegistration")
    public ServletRegistrationBean<cxfservlet> dispatcherServlet() {
        return new ServletRegistrationBean<>(new CXFServlet(),"/ws/*");
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }

    @Bean
    public Endpoint endpoint(UserService userService) {
        EndpointImpl endpoint = new EndpointImpl(springBus(), userService);
        endpoint.publish("/user");
        return endpoint;
    }

}</cxfservlet>

启动后访问wsdl说明书

http:localhost:8080/ws/user?wsdl

SpringBoot整合WebService(实用版)

Client搭建

pom.xml

<dependencies>
    <dependency>
        <groupid>org.apache.cxf</groupid>
        <artifactid>cxf-spring-boot-starter-jaxws</artifactid>
        <version>3.2.5</version>
    </dependency>
    <!--    不引入会报错  报接口未实现  -->
    <dependency>
        <groupid>org.hibernate</groupid>
        <artifactid>hibernate-validator</artifactid>
        <version>6.0.18.Final</version>
    </dependency>

    <dependency>
        <groupid>org.projectlombok</groupid>
        <artifactid>lombok</artifactid>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupid>org.apache.cxf</groupid>
            <artifactid>cxf-codegen-plugin</artifactid>
            <version>3.2.5</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceroot>src/main/resources/cxf</sourceroot>
                        <wsdloptions>
                            <wsdloption>
                                <wsdl>http://localhost:8080/ws/user?wsdl</wsdl>
                            </wsdloption>
                        </wsdloptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置类

@Configuration
public class CxfClientConfig {

    private final static String SERVICE_ADDRESS = "http://localhost:8080/ws/user";

    @Bean("cxfProxy")
    public UserPortType createUserPortTypeProxy() {
        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        jaxWsProxyFactoryBean.setAddress(SERVICE_ADDRESS);
        jaxWsProxyFactoryBean.setServiceClass(UserPortType.class);
        return (UserPortType) jaxWsProxyFactoryBean.create();
    }
}

编译转换

将XML格式的wsdl说明书转化为Java对象格式

在Client客户端项目根路径下调出控制台,如下

SpringBoot整合WebService(实用版)

使用maven命令进行转换,生成的Java代码在Client客户端下的src/main/resources/cxf目录下

mvn generate-sources

查看src/main/resources/cxf 下的文件,如下

创建com/aerfazhe/wsdl包路径,将这些JavaObject剪切到该包路径下,如下

Controller

@RestController
public class UserController {

    @Resource(name = "cxfProxy")
    private UserPortType userPortType;

    @GetMapping("/getUserName")
    public User getUserName(String name) {
        User user = userPortType.getUserName(name);
        return user;
    }

}

启动类

@SpringBootApplication
public class ClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class,args);
    }
}

application.yml

server:
  port: 8081

在当前项目根目录下,输入以下命令,将xml类型的wsdl说明书转化为Java对象

mvn generate-sources

SpringBoot整合WebService(实用版)

启动后访问:http://localhost:8081/getUserName?name=张三

SpringBoot整合WebService(实用版)

此时就调用成功喽

Original: https://www.cnblogs.com/aerfazhe/p/16093653.html
Author: 阿尔法哲
Title: SpringBoot整合WebService(实用版)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621600/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据库基础,看完这篇就够了!

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月11日
    096
  • 最全面的MySQL数据库讲解,老杜带你从基础入门mysql

    Original: https://www.cnblogs.com/chaichaichai/p/15624323.htmlAuthor: 牛仔码农Title: 最全面的MySQL…

    数据库 2023年5月24日
    091
  • RadonDB MySQL Kubernetes 2.2.1 发布!

    RadonDB MySQL Kubernetes[1] 于近日正式发布新版本 2.2.1[2]。该版本主要在用户管理、高可用组件等进行了优化,并修复一些问题。 感谢 @runkec…

    数据库 2023年5月24日
    077
  • Oracle 有排序的分页SQL写法

    第一种: 第二种: 第一种比第二种效率会高,这是因为:CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询…

    数据库 2023年6月16日
    091
  • 《MySQL自传》

    撰写本文查阅了大量参考资料,也得到很多朋友的指点帮助,特别感谢: Jimmy Yang——阿里云数据库研究员,原Oracle InnoDB Architect. 彭立勋——华为云数…

    数据库 2023年6月11日
    093
  • 计算机组成原理——概述篇

    计算机发展历史 电子管计算机(1946 年——1958 年) 第一台计算机为ENIAC 诞生于美国宾夕法尼亚大学 特点: 集成度小,空间占用大 功耗高,运行速度慢 操作复杂,更换程…

    数据库 2023年6月16日
    069
  • 从零搭建云原生技术kubernetes(K8S)环境-通过kubesPhere的AllInOne方式

    前言 k8s云原生搭建,步骤有点多,但通过kubesphere,可以快速搭建k8s环境,同时有一个以 Kubernetes 为内核的云原生分布式操作系统-kubesphere,本文…

    数据库 2023年6月16日
    095
  • 1 请谈谈面向对象的三大特征?

    隐藏对象的属性和实现细节,仅对外公开接口,控制程序中属性的读取和修改的访问级别; 封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据和操作数据的源代码有机结合,…

    数据库 2023年6月6日
    0206
  • Python 学习笔记(六)–线程

    1.自定义进程 自定义进程类,继承Process类,重写run方法(重写Process的run方法)。 from multiprocessing import Process im…

    数据库 2023年6月16日
    0126
  • 两表关联更新、删除-七星海棠

    两表关联更新 通用方法 update test1 set name=(select name from test2 where test2.id=test1.id), age=(s…

    数据库 2023年6月11日
    087
  • 阿里慢SQL治理5大经典案例

    菜鸟供应链金融慢sql治理已经有一段时间,自己负责的应用持续很长时间没有慢sql告警,现阶段在推进组内其他成员治理应用慢sql。这里把治理过程中的一些实践拿出来分享下。 一、全表扫…

    数据库 2023年5月24日
    0129
  • 删除chrome的域名安全策略

    使用过程中总有特殊情况必须使用http请求、又或者必须使用https请求 目前有两种思路,一种是浏览器默认开了http转https请求,像chrome和Firefox,另一种就是服…

    数据库 2023年6月6日
    0101
  • Java 杂记

    记载 Java 杂项的笔记和零碎的笔记 Java 杂记 一. Java 特性 1.1 封装 属性私有化,提供公共的可以访问的方法 1.2 继承(extends) Java &amp…

    数据库 2023年6月11日
    088
  • java中重载(overload)与重写(override)的区别

    方法重载(overload): 方法重载就是在一个类中可以创建多个方法,它们具有相同的名字,但是具有不同的参数和不同的定义,调用方法时通过传递给它们的不同参数个数和参数类型来决定具…

    数据库 2023年6月6日
    0109
  • MySQL日志系统bin log、redo log和undo log

    MySQL日志系统bin log、redo log和undo log 今人不见古时月,今月曾经照古人。 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息…

    数据库 2023年6月14日
    088
  • 利用VBS调戏别人,否则电脑关机

    利用VB脚本强制用户输入固定语句,否则系统将倒计时关机 将以下代码复制到文本文档中,保存后修改文件后缀名称为.vbs,打开该文件就可以看到效果了; on error resume …

    数据库 2023年6月11日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球