热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot整合WebService(服务端+客户端)

SpringBoot整合WebService(服务端客户端)文章目录SpringBoot整合WebService(服务端客户端࿰
SpringBoot整合WebService(服务端+客户端)

文章目录

  • SpringBoot整合WebService(服务端+客户端)
    • 一、服务端
      • 1.项目结构
      • 2.创建好SpringBoot项目后导入Maven依赖
      • 3.建一个pojo包存放实体类User
      • 4.建一个service包存放服务类
      • 5.建一个dao层
      • 6.在resources目录下建立一个mapper文件夹
      • 7.配置数据库
      • 8.配置并发布WebService(重中之重)
      • 9.发布WebService服务
    • 二、客户端
      • 1.service编程调用方式
        • 1.1目录结构
        • 1.2调用WebService
      • 2.使用WSDL生成本地客户端代码调用WebService
        • 2.1 生成本地客户端代码
        • 2.2 调用WebService服务
    • 三、问题及解决方案
      • 1.Exception in thread "main" com.sun.xml.internal.ws.fault.ServerSOAPFaultException
      • 2.A query was run and no Result Maps were found for the Mapped Statement


一、服务端

本项目通过SpringBoot+Mybatis整合WebService,实现服务端接收客户端传入的数据并将其写入数据库等功能,

1.项目结构

image-20220521162053648

2.创建好SpringBoot项目后导入Maven依赖

直接把全部换成我的

org.springframework.bootspring-boot-starterorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.junit.vintagejunit-vintage-engineorg.springframework.bootspring-boot-starter-web-servicesorg.apache.cxfcxf-rt-frontend-jaxws3.2.0org.apache.cxfcxf-rt-transports-http3.2.0org.apache.cxfcxf-core3.3.5org.apache.cxfcxf-rt-transports-http3.2.4org.mybatis.spring.bootmybatis-spring-boot-starter2.1.4mysqlmysql-connector-javaruntimeorg.projectlomboklombok

3.建一个pojo包存放实体类User

import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class User {private Integer id;private String userId;private String userName;}

4.建一个service包存放服务类

UserService

package cn.edu.usts.sbmpservice.service;import cn.edu.usts.sbmpservice.pojo.User;import javax.jws.WebParam;
import javax.jws.WebService;
import java.text.ParseException;@WebService(name = "UserService", // 暴露服务名称targetNamespace = "http://service.sbmpservice.usts.edu.cn"// 命名空间,一般是接口的包名倒序
)
public interface UserService {int addUser(User user);User queryUser(Integer id);}

UserServiceImpl接口实现类

package cn.edu.usts.sbmpservice.service.impl;import cn.edu.usts.sbmpservice.dao.UserDao;
import cn.edu.usts.sbmpservice.dao.YljgjxcDao;
import cn.edu.usts.sbmpservice.pojo.User;
import cn.edu.usts.sbmpservice.pojo.Yljgjxc;
import cn.edu.usts.sbmpservice.service.UserService;
import cn.edu.usts.sbmpservice.utils.util;
import org.springframework.beans.factory.annotation.Autowired;import javax.jws.WebService;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;//@Component
@WebService(serviceName = "UserService", // 与接口中指定的name一致targetNamespace = "http://service.sbmpservice.usts.edu.cn", // 与接口中的命名空间一致,一般是接口的包名倒endpointInterface = "cn.edu.usts.sbmpservice.service.UserService"// 接口地址
)
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic int addUser(User user ){System.out.println("addUser");return userDao.addUser(user);}@Overridepublic User queryUser(Integer id){System.out.println("queryUser"+" "+id);User user = userDao.queryUser(id);System.out.println(user);return userDao.queryUser(id);}}

5.建一个dao层

UserDao 处理数据

package cn.edu.usts.sbmpservice.dao;import cn.edu.usts.sbmpservice.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;@Mapper
@Repository
public interface UserDao {int addUser(User user);User queryUser(Integer id);}

6.在resources目录下建立一个mapper文件夹

UserDao.xml



insert into user.user(userId,userName) values (#{userId},#{userName})

7.配置数据库

将application文件后缀改成yml格式,然后根据自己的情况配置数据库和端口号

mybatis:type-aliases-package: cn.edu.usts.sbmpservice.pojomapper-locations: classpath:mapper/*.xml
spring:datasource:username: rootpassword: rooturl: jdbc:mysql://localhost:3306?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8server:port: 8081

8.配置并发布WebService(重中之重)

新建一个config目录,存放配置文件

startclass.java

package cn.edu.usts.sbmpservice.config;import cn.edu.usts.sbmpservice.service.UserService;
import cn.edu.usts.sbmpservice.service.impl.UserServiceImpl;
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 javax.xml.ws.Endpoint;@Configuration
public class StartClas {@Bean(name = Bus.DEFAULT_BUS_ID)public SpringBus springBus() {return new SpringBus();}@Bean(name = "wsBean")public ServletRegistrationBean dispatcherServlet() {ServletRegistrationBean wbsServlet = new ServletRegistrationBean(new CXFServlet(), "/ws/*");return wbsServlet;}@Beanpublic UserService userService() {return new UserServiceImpl();}@Beanpublic Endpoint endpointPurchase(SpringBus springBus, UserService userService) {EndpointImpl endpoint = new EndpointImpl(springBus(), userService());endpoint.publish("/api");System.out.println("服务发布成功!地址为:http://localhost:8081/ws/api?wsdl");return endpoint;}
}

9.发布WebService服务

image-20220521160910920

服务发布成功,打开浏览器输入地址

image-20220521161049487

出现如图所示内容表示服务发布成功,图片内容是wsdl(网络服务描述语言,Web Services Description Language),用于描述 Web Services 以及如何对它们进行访问.接下来就可以编写客户端了。

二、客户端

客户端调用WebService接口有很多种方法,这里只展示两种,推荐使用第一种

1.service编程调用方式


1.1目录结构

需要将服务端的pojo和service文件同步到客户端

image-20220521162130729

1.2调用WebService

package cn.edu.usts;import cn.edu.usts.pojo.User;
import cn.edu.usts.service.UserService;import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;public class Client {public static void main(String[] args) throws MalformedURLException {System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");//创建WSDL的URLURL url = new URL("http://localhost:8080/ws/api?wsdl");// 指定命名空间和服务名称QName qName = new QName("http://service.sbmpservice.usts.edu.cn", "UserService");Service service = Service.create(url, qName);// 通过getPort方法返回指定接口UserService myServer = service.getPort(UserService.class); // 方法1
// UserService myServer = service.getPort(new QName("http://serviceImpl.service.usts.edu.cn/", "UserServiceImplPort"), UserService.class); // 方法2// 调用方法 获取返回值User user1 = new User(2,"tom");myServer.addUser(user1);User user = myServer.queryUser(2);System.out.println(user.toString());}}

编译

image-20220521163519950

客户端如图所示。数据插入成功,查询成功,成功调用web Service接口

image-20220521163638000

服务端如图所示。成功接收到客户端发来的数据并将其写入数据库

image-20220521163721657

数据库如图所示,成功插入数据

2.使用WSDL生成本地客户端代码调用WebService

该种方式使用简单,但一些关键的元素在代码生成时写死到生成代码中,不方便维护,所以仅用于测试。

2.1 生成本地客户端代码

新建一个项目,直接在项目中生成客户端代码(不需要在别的地方生成再复制过来)

打开终端

image-20220521164619648

进入到src/main/java/…目录下,使用wsimport 命令,生成客户端代码

wsimport -keep -extension http://localhost:8080/ws/api?wsdl

image-20220521165028333

回车,然后就可以在目录中看到生成的客户端代码

image-20220521165201388

2.2 调用WebService服务

public class app {public static void main(String[] args) {//创建服务访问点集合的对象UserService_Service has = new UserService_Service();//获取服务实现类//根据服务访问点的集合中的服务访问点的绑定对象来获得绑定的服务类UserService soap = has.getUserServiceImplPort();//调用服务User user = soap.queryUser(2);System.out.println(user.toString());}
}

三、问题及解决方案


1.Exception in thread “main” com.sun.xml.internal.ws.fault.ServerSOAPFaultException

image-20220521165839981

使用service编程调用接口时报错,在网上查资料说是webservice内部jar版本与现在所用的jdk的jar有冲突,需要设置下系统属性,在代码中加入

System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");

2.A query was run and no Result Maps were found for the Mapped Statement

原因:在服务端的mapper中忘记了指定resultType属性

image-20220521170444116


推荐阅读
  • 【简答题】统计一个文档中单词的频次【简答题】(1)提取出www.python.org网站上所有列表的名称和内容(2)提取出www.python.org网站上所有嵌入在列表中的所有链 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • 1.WebServicea.定义:WebService是一种跨编程语言和跨操作系统平台的远程调用技术b.三大技术:XMLXSD,SOAP, ... [详细]
  • 1.一般应用(访问名称空间下方法)usenamespacemx_internal;vartextArea:TextAreaTextArea();textArae.htmlText ... [详细]
  • WCF分布式开发常见错误(30):StartelementBinaryexpected(期望的初始元素是Binary).FoundSayHello.调试WCF4.0代 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
tha1es
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有