SpringBoot项目添加WebService服务

这篇具有很好参考价值的文章主要介绍了SpringBoot项目添加WebService服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简单描述

WebService简单理解就是用http发送接收xml数据,但这个xml得遵守系统的规范。这个规范就是WSDL(Web服务描述语言,Web Services Description Language)。

在WebService中传输的xml有一个正式的名称叫Soap(简单对象访问协议 Simple Object Access Protocol)。

WebService分为客户端和服务端。这两个都可以做数据源提供数据,比如说客户端发送大量数据给服务端,服务端接收大量数据。也可以是客户端发起请求获取服务端提供的大量数据。所有谁生产谁消费这事对Webservice不必纠结。

2.代码实现

SpringBoot项目中还是推荐使用注解的方式实现WebService,这样比较优雅。

1.首先要引入大量的依赖。目前部分jar可能有漏斗,如果项目对安全有较高的要求请引入没有漏洞版本的jar

<!--			webService依赖-->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-core</artifactId>
            <version>${cxf-core.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf-core.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>${cxf-core.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf-core.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>${cxf-core.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-ri</artifactId>
            <version>2.3.5</version>
            <type>pom</type>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.cxf.services/cxf-services -->
        <dependency>
            <groupId>org.apache.cxf.services</groupId>
            <artifactId>cxf-services</artifactId>
            <version>3.4.3</version>
            <type>pom</type>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-bindings-soap -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-bindings-soap</artifactId>
            <version>${cxf-core.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-api -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-api</artifactId>
            <version>2.7.18</version>
        </dependency>

接着实现服务器端的代码

服务器端的代码有两部分一部分是WebService接口,一部分是发布WebService的配置类

接口定义(规范WSDL)

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * Webservice 发送数据
 * @author dhh
 */
@WebService(serviceName = "WebServiceSender",
        targetNamespace="http://service.modules.jeecg.org/",
        endpointInterface = "org.jeecg.modules.service.WebServiceServer")
public interface WebServiceServer {


    @WebMethod(operationName = "Invoke")
    void invoke(@WebParam(name="from",targetNamespace = "http://service.modules.jeecg.org/")String from,
                              @WebParam(name="token",targetNamespace = "http://service.modules.jeecg.org/")String token,
                              @WebParam(name="funcName",targetNamespace = "http://service.modules.jeecg.org/")String funcName,
                              @WebParam(name="parameters",targetNamespace = "http://service.modules.jeecg.org/")String parameters) throws Exception;
}

实现类(接收到请求后服务器端做处理)

import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.service.WebServiceServer;
import org.springframework.stereotype.Service;

/**
 * @author dhh
 */
@Slf4j
@Service
public class WebServiceSenderServiceImpl implements WebServiceServer {

    @Override
    public void invoke(String from, String token, String funcName, String parameters) throws Exception {
        if("数据来源".equals(from)){
            switch (funcName) {
            }
        }else{
            log.info("未知来源的数据{},禁止写入!",from);
            throw new Exception("未知来源的数据,禁止写入");
        }
    }
}

配置类(发布服务)

import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.jeecg.modules.service.WebServiceServer;
import org.jeecg.modules.service.impl.WebServiceSenderServiceImpl;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;


/**
 * @author dhh
 */
@Configuration
public class WebServiceConfig {

    @Bean(name = "cxfServlet")  // 注入servlet bean name不能dispatchlet ,否则会覆盖dispatcherServlet
    public ServletRegistrationBean<CXFServlet> cxfServlet() {
        return new ServletRegistrationBean<CXFServlet>(new CXFServlet(), "/webservice/*");
    }
    @Bean
    public WebServiceServer webServiceSender() {
        return new WebServiceSenderServiceImpl();
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }
    @Bean
    public Endpoint endpoint() {
        // 参数二,是SEI实现类对象
        EndpointImpl endpoint = new EndpointImpl(this.springBus(),this.webServiceSender());
        // 发布服务
        endpoint.publish("/server");
        return endpoint;
    }

}

接下来启动项目访问/webservice/server?wsdl 就可以看看WSDL的内容了。

然后搭建客户端

客户端搭建很简单,就是用http发送一个xml,困难在xml数据的格式要遵守服务端定义的wsdl要求。比如命名空间要和服务端的一致(http://service.modules.jeecg.org/),参数数量和名称也要和服务端定义的一致方可

import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.jeecg.modules.bean.WebServiceRequest;
import org.jeecg.modules.entity.AttachmentInfo;
import org.jeecg.modules.entity.ProjectInfo;
import org.jeecg.modules.entity.ProjectScope;
import org.jeecg.modules.service.WebServiceClientService;
import org.springframework.stereotype.Service;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;

/**
 * @author dhh
 */
@Slf4j
@Service
public class WebServiceClientServiceImpl implements WebServiceClientService {
    /**
     * 发送请求,发送请求时,将数据封装起来
     */
    @Override
    public String send(WebServiceRequest request, String xmlEntry) {
        try {
            URL url = new URL(request.getRequestUrl());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            String xml = this.requestXmlBuilder(request.getEsbCode(), request.getComp(),request.getFrom(),request.getToken(), request.getFuncName(), xmlEntry);
            connection.setRequestProperty("Content-Length",String.valueOf(xml.length()));
            OutputStream out = connection.getOutputStream();
            out.write(xml.getBytes(StandardCharsets.UTF_8));
            int responseCode = connection.getResponseCode();
            if(responseCode==200){
                InputStream in = connection.getInputStream();
                String result = getResult(in);
                log.info(result);
                return result;
            }
        } catch (IOException e) {
            log.error(e.getMessage());
        }
        return "ERROR";
    }

这里我将构建xml单独写了一个方法,可以根据服务端WSDL规范自行定义

private String requestXmlBuilder(String esbCode,String COMP,String from ,String token,String funcName,String xml){
        StringBuffer buffer= new StringBuffer();
        buffer.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:boi=\"http://service.modules.jeecg.org/\">");
        buffer.append("<soapenv:Header>");
        buffer.append("<extraParams>");
        buffer.append("<esbCode>");
//       esbCode:数据
        buffer.append(esbCode);
        buffer.append("</esbCode>");

        buffer.append("<COMP>");
//       COMP:数据
        buffer.append(COMP);
        buffer.append("</COMP>");
        buffer.append("</extraParams>");
        buffer.append("</soapenv:Header>");
        buffer.append("<soapenv:Body>");
        buffer.append("<boi:Invoke>");
        buffer.append("<boi:from>");
        buffer.append(from);
        buffer.append("</boi:from>");
        buffer.append("<boi:token>");
        buffer.append(token);
        buffer.append("</boi:token>");
        buffer.append("<boi:funcName>");
//        funcName:数据
        buffer.append(funcName);
        buffer.append("</boi:funcName>");
        buffer.append("<boi:parameters><![CDATA[");
//        XML:数据
        buffer.append(xml);
        buffer.append("]]></boi:parameters>");
        buffer.append("</boi:Invoke>");
        buffer.append("</soapenv:Body>");
        buffer.append("</soapenv:Envelope>");
        return buffer.toString();

    }

后面直接调用客户端方法请求本地服务端就可以测试客户端了,以上结束。

参考连接:webservice关于入参掉用各种报错信息及解决方法汇总org.apache.cxf.interceptor.Fault: Unmarshalling Error: 意外的元素...... - 走看看

实例篇——webservice实现互相传递数据 - 走看看

Apache CXF -- Developing a Service

后面还有拦截器的用法,感兴趣的可以了解一下!文章来源地址https://www.toymoban.com/news/detail-591238.html

到了这里,关于SpringBoot项目添加WebService服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IDEA中在Java项目中添加Web模块 与配置tomcat服务器

    现有项目添加直接走第二步 勾选 Web Application 选项, 点击OK 得到项目目录结构 , 出现web目录结构, 且web目录文件夹出现小蓝点 说明web配置没有出现或是手动构建的目录结构 , 在IDE关闭或者迁移项目时会出现 这时web模块是无法运行的 解决 打开 Project Stucture 选中web模块, 配置De

    2024年01月16日
    浏览(118)
  • IDEA搭建Java Web项目及添加Web框架支持和配置Tomcat服务器(2023最新版)

     File — New — Project Java — Project SDK中选择自己的版本(这里采用1.8) —点击Next 此项不选 直接点击Next 设置项目名称之后 点击 Finish 鼠标右键项目名 — Add Frameworks Support   勾选第一项 Web Application — 点击 OK 出现web目录后即为Web框架支持添加成功   点击Add Configruation 点击添加

    2024年02月13日
    浏览(82)
  • java springboot VUE粮食经销系统开发mysql数据库web结构java编程计算机网页源码maven项目

    一、源码特点   springboot VUE 粮食经销系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发) ,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 springboot vue 粮食经销系统

    2024年02月05日
    浏览(47)
  • 手动将Java SpringBoot项目部署到云服务器上(使用docker)

    本文记录一下我作为一个小白如何通过docker手动将java springboot项目部署到云服务器上(以腾讯云的轻量应用服务器为例)。 但是我个人还是推荐安装一个宝塔面板部署 ,真的全程自动化,非常方便,网上有很多相关的教程可以搜搜看。所以我写这个教程其实只想记录一下我

    2024年04月25日
    浏览(43)
  • 34、springboot切换内嵌Web服务器(Tomcat服务器)与 生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS

    知识点1:springboot切换内嵌Web服务器(Tomcat服务器) 知识点2:生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS spring-boot-starter-web 默认依赖 Tomcat 内置服务器 改为 Jetty 服务器 改为 Undertow 服务器 目的:把请求路径 http://xxxxx 改成 https://xxxxx 如图:原本普通的项目,启动后是http的

    2024年02月11日
    浏览(52)
  • Springboot 订餐管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

    一、源码特点   springboot 订餐管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有 完整的源代码和数据库,系统主要采用B/S模式开发。 前段主要技术 bootstrap.css jquery 后端主

    2024年02月07日
    浏览(51)
  • springboot项目中添加自定义日志

    或 application.yml文件中的配置 对上述的配置进行说明:

    2024年02月17日
    浏览(44)
  • SpringBoot项目中添加证书授权认证

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 在上线的项目中,需要添加一个定时授权的功能,对系统的进行授权认证,当授权过期时提示用户需要更新授权或获取授权,不让用户无限制的使用软件。 在查阅相关资料进行整理后,对该场景做了一

    2024年01月20日
    浏览(38)
  • SpringBoot+Vue项目添加腾讯云人脸识别

    人脸识别是一种基于人脸特征进行身份认证和识别的技术。它使用计算机视觉和模式识别的方法,通过分析图像或视频中的人脸特征,例如脸部轮廓、眼睛、鼻子、嘴巴等,来验证一个人的身份或识别出他们是谁。 人脸识别可以应用在多个领域,包括安全领域、访问控制系统

    2024年02月11日
    浏览(36)
  • 使用Gradle7.6.1 + SpringBoot3.0.2 + java17创建微服务项目(学习)

    这是一个大胆的决定 技术 版本 spring-boot 3.0.2 spring-cloud 2022.0.2 spring-cloud-alibaba 2022.0.0.0-RC2 mybatis-plus-boot-starter 3.5.3.1 mysql-connector-java 8.0.32 技术 版本 java 17 gradle 7.6.1 IDEA 2022.2.4 Nvcat 15 MySQL 8.0.32 打开IDEA创建 SpringBoot项目 删除父项目中的src模块 新建两个子项目(新建时会重新创建

    2024年02月06日
    浏览(89)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包