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.项目结构

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

直接把全部换成我的

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- web启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!-- webService--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-core</artifactId><version>3.3.5</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>3.2.4</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

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

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.edu.usts.sbmpservice.dao.UserDao"><insert id="addUser" parameterType="User">insert into user.user(userId,userName) values (#{userId},#{userName})</insert><select id="queryUser" resultType="User">select * from user.user where userId = #{userId}</select></mapper>

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服务

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

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

二、客户端

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

1.service编程调用方式

1.1目录结构

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

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());}}

编译

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

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

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

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

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

2.1 生成本地客户端代码

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

打开终端

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

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

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

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

使用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属性

SpringBoot整合WebService(服务端+客户端)相关推荐

  1. delphi xe 文件服务器,DelphiXE7中创建WebService(服务端+客户端)

    相关资料: http://www.2ccc.com/news/Html/?1507.html http://www.dfwlt.com/forum.php?mod=viewthread&tid ...

  2. DelphiXE7中创建WebService(服务端+客户端)

    相关资料: http://www.2ccc.com/news/Html/?1507.html http://www.dfwlt.com/forum.php?mod=viewthread&tid ...

  3. Springboot整合socket服务端

    使用springboot框架实现socket通信的服务端,接收客户端发来的消息. 随项目启动而启动. package com.socket;import java.io.IOException; im ...

  4. Spring和CXF整合发布WebService(服务端、客户端)

    参考Spring和CXF整合发布WebService(服务端.客户端) 转载于:https://www.cnblogs.com/timspace/p/11113576.html

  5. 服务端使用Axis2-1.6.3发布webservice服务、客户端使用Axis1.4实现调用

    一.准备工作 下载Axis2-1.6.3-war.zip 下载链接 下载Axis1.4相关jar包 下载链接 二.开发Webservice服务端代码 使用环境:myeclipse6.6+tomcat6 ...

  6. springboot+websocket实现服务端、客户端

    一.引言 小编最近一直在使用springboot框架开发项目,毕竟现在很多公司都在采用此框架,之后小编也会陆续写关于springboot开发常用功能的文章. 什么场景下会要使用到websocket的呢 ...

  7. WebService服务端与客户端开发

    最近客户提出了将我们做的系统接入到他们系统之中,方便他们进行集中管理这个需求,其中主要就是运用了WebService技术来进行系统之间的接入.在此记录一下整个WebService是如何嵌入我们系统的以 ...

  8. SpringBoot+SOCKET服务端客户端

    springBoot启动socket服务端 socket服务端简单实现实例 springBoot启动socket服务端 SOCKET服务端启动 SOCKET客户端连接测试 模拟业务处理线程类 模拟监测 ...

  9. SpringBoot+Axis2搭建WebService服务端

    SpringBoot+Axis2搭建WebService服务端 之前用过Spring + Axis2搭建过WebService项目,网上也有很多资料教程,最近需要在一个SpringBoot项目中添加A ...

最新文章

  1. 文件上传的实现(C#)
  2. [zz]启动apache后访问系统,提示没有权限访问目录,报403错误。
  3. 【转】ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证)...
  4. 第七天2017/04/14(引用与const、C++基本知识)
  5. mysql 导入 相对路径,MySQL数据库导出与导入及常见错误解决
  6. CSS基础(part9)--CSS背景
  7. C++之手写strlen函数
  8. python实现手机号归属地相关信息查询
  9. turtle模块还能这样玩?(一条条金龙鱼、雨景)
  10. python柱形图绘制_Python Excel 绘制柱形图
  11. Struts2框架 下载和配置
  12. 城建坐标与经纬度转换工具
  13. java udp发16进制数据_如何通过接口强制发送UDP数据包?
  14. 【POJ 1838 --- Banana】
  15. 统计局:2018年全国规模以上工业企业利润增长10.3%
  16. 正则表达式之多种格式的电话号码匹配
  17. 计算机视觉期末复习(上)
  18. 深度学习笔记其五:卷积神经网络和PYTORCH
  19. python在Scikit-learn中用决策树和随机森林预测NBA获胜者
  20. 最新水利水电安全员考试判断题库(2)

热门文章

  1. 使用SQL语句修改MYSQL数据库密码
  2. 未雨绸缪:Java高级架构进阶必学之 ⑥ 大知识要点附视频学习资料
  3. 要点初见:切换老版本Rust并运行老版本cargo
  4. SL651-2014水文监测RTU解决方案
  5. (Linux无线网卡WIFI上网 三 )嵌入式Linux下的WIFI使用
  6. WEBBASIC Unit03 CSS声明
  7. 看山是山(又名《我仍是少年》)
  8. php 后缀文件怎么打开,php是什么文件格式,php扩展名文件如何打开?
  9. 天国没有加班,胡新宇兄弟一路好走
  10. 永远抢不到原价演唱会门票?来试试窗口同步功能吧