Spring-boot集成swagger以及MapStruct简单使用

news2024/11/27 20:29:09

1)添加依赖,我使用3.0.0版本时会出现swagger-ui页面404的问题,所以改成2.9.2,使用默认版本swagger-model会出现判空异常。

<!--        swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
            <exclusions>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-models</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.5.21</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

2)swagger注入配置

         要分多少类别就注入多少个Docket,enable使用配置文件,根据运行环境来决定是否启用,一般生产环境不要开启swagger。

package com.example.jiakao.common.config;

import com.example.jiakao.common.prop.ProjProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

@Configuration
@EnableSwagger2
public class SwaggerCfg {
    private static final String VERSION = "1.0.0";
    @Autowired
    private ProjProperties properties;
    @Bean
    public Docket docket(){
        return basicDocket("all")
                .apiInfo(apiInfo("接口文档","详细接口文档"))
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .build();
    }
    @Bean
    public Docket dictDocket(){
        return basicDocket("dict","/(dict.*)")
                .apiInfo(apiInfo("dict接口文档","dict详细接口文档"));
    }

    private ApiInfo apiInfo(String title, String description){
        ApiInfoBuilder builder = new ApiInfoBuilder();
        builder.title(title);
        builder.description(description);
        builder.version(VERSION);
        return builder.build();
    }
    private Docket basicDocket(String name){
        Parameter token = new ParameterBuilder()
                .name("Token")
                .description("用户登录令牌")
                .parameterType("header")
                .modelRef(new ModelRef("String"))
                .build();
        return new Docket(DocumentationType.SWAGGER_2)
                .ignoredParameterTypes(HttpSession.class, HttpServletRequest.class, HttpServletResponse.class)
                .groupName(name)
                .enable(properties.getSwagger());
//                .globalOperationParameters(List.of(token));
    }
    private Docket basicDocket(String name, String regex){
        return basicDocket(name)
                .select()
                .paths(PathSelectors.regex(regex))
                .build();
    }
}

3)常用注解

4)项目结构完善

        数据库po对象应该与vo对象分离开,对于swagger的配置应该标注在vo对象上,而不应该与po对象混在一起。

po对象,用于数据库操作

package com.example.jiakao.pojo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import javax.persistence.*;

@Entity
@Data
@TableName("plate_region")
@Table(name="plate_region")
public class PlateRegionPo {
    @Id
    @TableId(type = IdType.AUTO)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column( columnDefinition = "int4" )
    private Integer id;
    @Column( columnDefinition = "varchar(64)" )
    private String name;
    @Column( columnDefinition = "varchar(64)" )
    private String plate;
    @Column( columnDefinition = "int4 default 0 " )
    private Integer parentId;
}

 vo对象,用于保存时传参

package com.example.jiakao.pojo.vo.req.save;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel("保存一个省份或者城市信息的参数")
public class PlateRegionReqVo {
    @ApiModelProperty(value = "省份或者城市的id")
    private Integer id;
    @ApiModelProperty(value = "省份或者城市的名称", required = true)
    private String name;
    @ApiModelProperty(value = "省份或者城市的代号", required = true)
    private String plate;
    @ApiModelProperty(value = "城市所属省份的id,省份为0,默认值为0", required = true)
    private Integer parentId = 0;
}

        因为将将参数与po对象分开了,所以会射涉及大量vo转po,这里可以使用mapstruct来简化转化过程。

<!--        对象转换,编译期间存在-->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.3.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.5.3.Final</version>
            <scope>provided</scope>
        </dependency>

        在做vo和po之间相互转换时,我们有时候会有将一个类型转为其他类型或者字段名不一致的情况,这时候我们可以使用MapStrcut的Mapping注解。

@Mapping(source = "createTime",target="createTime",qualifiedBy = MapStructFormatter.Date2Millis.class)

qualifiedBy属性指定类型转换使用的方法,该方法拥有一个Date2Millis注解。注解和转换方法定义如下。规定注解必须要使用@Qualifier注解标注。@Retention(RetentionPolicy.CLASS)代表该注解只在编译期间起作用。@Target(ElementType.METHOD)代表该注解应标注在方法上。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Date;

public class MapStructFormatter {
    @Qualifier
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.CLASS)
    public @interface Date2Millis {
    }
    @Date2Millis
    public static Long date2millis(Date date){
        if(date == null) return null;
        return date.getTime();
    }
    @Qualifier
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.CLASS)
    public @interface Millis2Date {
    }
    @Millis2Date
    public static Date millis2date(Long timeStamp){
        if(timeStamp == null) return null;
        return new Date(timeStamp);
    }
}

        使用方式,用不了泛型。@Mapper(uses = {MapStructFormatter.class})代表应在哪个类中寻找转换方法。qualifiedBy = MapStructFormatter.Date2Millis.class)代表应该使用被Date2Millis注解标注的方法进行类型转换。

package com.example.jiakao.common.mapStruct;

import com.example.jiakao.pojo.entity.*;
import com.example.jiakao.pojo.vo.list.UserVo;
import com.example.jiakao.pojo.vo.req.save.*;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(uses = {
       MapStructFormatter.class
})
public interface MapStructs {
    // 接口中的属性只能是public static,可以省略
    MapStructs INSTANCE = Mappers.getMapper(MapStructs.class);

    @Mapping(source = "createTime",target="createTime",qualifiedBy = MapStructFormatter.Date2Millis.class)
    @Mapping(source = "updateTime",target="updateTime",qualifiedBy = MapStructFormatter.Date2Millis.class)
    UserVo po2vo(UsersPo po);

    ExamPlacePo reqVo2po(ExamPlaceReqVo vo);
    PlateRegionPo reqVo2po(PlateRegionReqVo vo);
    ExamCoursePo reqVo2po(ExamCourseReqVo po);
    UsersPo reqVo2po(UsersReqVo po);
    RolesPo reqVo2po(RolesReqVo po);
    ResourcePo reqVo2po(ResourceReqVo po);
}

         同时我们可以抽离一个BaseController的抽象类,实现一些基础接口。

package com.example.jiakao.controller;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.jiakao.common.constant.ResultCode;
import com.example.jiakao.exception.http.ArgumentsException;
import com.example.jiakao.common.util.Vos;
import com.example.jiakao.pojo.vo.json.JsonVo;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Arrays;

/**
 *
 * @param <Po> 数据库entity类
 * @param <ReqVo> pojo.vo.req.save中的类,用于插入数据库的请求参数,非entity
 */
public abstract class BaseController<Po, ReqVo> {
    protected abstract IService<Po> getService();
    protected abstract Po reqVo2Po(ReqVo reqVo);
    @ApiOperation("删除一条数据或多条数据")
    @PostMapping("/remove")
    public JsonVo remove(
            @ApiParam(value = "一个或多个id,以逗号分割",required = true)
            @RequestParam String id){
        String[] ids = id.split(",");
        if(getService().removeByIds(Arrays.asList(ids))){
            return Vos.ok();
        } else{
            throw new ArgumentsException(ResultCode.ARGUMENTS_ERROR);
        }
    }
    @ApiOperation("保存一条数据")
    @PostMapping("/save")
    public JsonVo save(@RequestBody ReqVo vo) {
        Po entity = reqVo2Po(vo);
        if(getService().saveOrUpdate(entity)){
            return Vos.ok();
        } else{
            throw new ArgumentsException(ResultCode.ARGUMENTS_ERROR);
        }
    }
}

 目录结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+nodejs+php+springboot+vue 社区小区报修 -社区信息管理

客户可以对社区信息进行添加&#xff0c;修改&#xff0c;删除以及查询操作。界面如下图所示: 四、客户模块的实现 4.1车位租买支付 客户可以对车位信息进行租买后可以在个人后台进行支付操作。界面如下图所示: 4.2前台车位信息 客户登录之后&#xff0c;可以查看前台车位…

传输层 — UDP协议

目录 一、传输层 1.1 端口号 1.2 关于端口的常见问题 1.3 netstat && pidof 二、UDP协议 2.1 UDP协议格式 2.2 UDP协议特点 2.3 UDP缓冲区 2.4 基于UDP的应用层协议 一、传输层 在进行网络传输时&#xff0c;应用层需先将数据交给传输层&#xff0c;由传输层…

基于matlab仿真混合波束成形在多用户MIMO-OFDM系统中的使用

一、前言 本 例 说明 了 如何 在 大规模 MIMO 通信 系统 的 发射 端 采用 混合 波束 成形&#xff0c; 同时 使用 多 用户 和 单 用户 系统 的 技术。该示例采用全通道探测来确定发射机的通道状态信息。它将所需的预编码划分为数字基带和模拟RF组件&#xff0c;对多用户和单用户…

智能的PHP开发工具PhpStorm v2023.1全新发布——集成3v4l.org

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 PhpStorm v20…

商城订单模块实战 - 数据库设计、ABA问题处理、读写分离分库分表

引言 订单系统可以说是整个电商系统中最重要的一个子系统&#xff0c;因此订单数据可以算作电商企业最重要的数据资产。这篇文章我们来看看在我们的商城系统中订单服务是如何实现的&#xff0c;特别是在设计和实现一个订单系统的过程中有哪些问题是需要特别考虑的。 业务分析…

逾 200 家港企参与! GoGBA大湾区发展日(广州)圆满举行

2023年4月26日 – 由香港特别行政区政府政制及内地事务局粤港澳大湾区发展办公室、香港特别行政区政府驻粤经济贸易办事处&#xff08;驻粤办&#xff09;、香港贸易发展局&#xff08;香港贸发局&#xff09;广州办事处&#xff0c;以及香港贸发局GoGBA商贸支援合办的GoGBA大湾…

BSN-DDC基础网络详解(十):官方DDC应用SDK

官方 SDK 是 BSN 联盟为平台方推出的可快速接入 DDC 网络的工具包&#xff0c;目前 DID 和各个开放联盟链的官方 DDC SDK 都使用 Java 语言开发&#xff0c;其它主流语言的 SDK 根据市场反馈我们将陆续增加。如果算力中心方和平台方的业务系统的开发语言与 SDK 不匹配&#xff…

基于DSP+FPGA+ADS1282支持31Bit高精度数据采集方案(一)

3.1 系统需求分析 3.1.1 系统功能设计要求 本硬件处理平台的主要任务有三类&#xff0c;一是数据采集&#xff0c;包括采集惯性测量元件 的输出信号&#xff0c;接收外部系统校正信息&#xff0c;如 GPS 信息等&#xff1b;二是数据处理与计算&#xff0c;包 括惯性测量…

如何实现自动化按图片搜索淘宝商品(拍立淘)功能?拍立淘API接口item_search_img

我们都知道淘宝平台推出了拍立淘功能&#xff0c;如果大家遇到了自己喜欢的商品&#xff0c;就可以拍一张照片&#xff0c;在淘宝用拍立淘搜索就能够出现相似的同款&#xff0c;这样就不用再去找别人要链接了。淘宝拍立淘主要是通过图片识别来找相似主图的宝贝&#xff0c;那么…

基于JavaSpringmvc+myabtis+html的鲜花商城系统设计和实现

基于JavaSpringmvcmyabtishtml的鲜花商城系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

分布式的流处理平台Kafka

目录&#xff1a; 一、简介二、基本概念三、生产者使用详解四、发送消息五、消费者代码示例 一、简介 ApacheKafka 是一个分布式的流处理平台。它具有以下特点&#xff1a; 支持消息的发布和订阅&#xff0c;类似于 RabbtMQ、ActiveMQ 等消息队列&#xff1b;支持数据实时处理…

从零开始实现VAE和CVAE

扩散模型可以看作是一个层次很深的VAE(变分自编码器)&#xff0c;前向&#xff08;forward&#xff0c;或者译为正向&#xff09;的过程&#xff0c;通过在多个尺度上添加噪声来逐步扰乱数据分布&#xff1b;然后是反向的过程&#xff0c;去学习如何恢复数据结构&#xff0c;上…

喜报 | 国家发明专利证书! 再添2项!

​近日&#xff0c;擎创科技自主研发的《一种基于倒序表的实时日志聚类分析方法》以及《一种基于社区检测的运维告警场景生成方法》正式获得国家颁发的发明专利证书&#xff01;擎创的专业性、自主性、创新能力、技术水平以及研发实力在得到了确切的肯定。 作为智能运维领域领先…

DJ4-5 路由算法:LS 和 DV

目录 一、迪杰斯特拉算法 1. 术语定义 2. 算法描述 3. 举例说明 4. 构建从源节点到目的节点的路径 5. 构建最低费用路径树 6. 构建转发表 二、距离向量路由算法 1. 术语定义 2. 举例说明 3. 距离向量表 4. 更新距离向量表 5. 举例说明 三、距离向量路由算法 PLUS…

多维评测指标解读2022MSU世界编码器大赛结果

是极致性能&#xff0c;更是最佳商用。 19项第一之上&#xff0c;是63%的极致带宽降低 近日&#xff0c;2022 MSU世界视频编码器大赛成绩正式揭晓。报告显示&#xff0c;阿里媒体处理服务MPS&#xff08;Alibaba Media Processing Service&#xff09;s264及s265编码器共计斩获…

【黑马旅游案例记录(结合ES)】

黑马旅游案例记录 11.9.黑马旅游案例11.9.1.酒店搜索和分页11.9.1.1.需求分析11.9.1.2.定义实体类11.9.1.3.定义controller11.9.1.4.实现搜索业务 11.9.2.酒店结果过滤11.9.2.1.需求分析11.9.2.2.修改实体类11.9.2.3.修改搜索业务 11.9.3.我周边的酒店11.9.3.1.需求分析11.9.3.…

10 【Sass语法介绍-继承】

1.前言 在我们编写样式的时候&#xff0c;很多情况下我们几个不同的类会有相同的样式代码&#xff0c;同时这几个类又有其自己的样式代码&#xff0c;这使我们就可以通过 Sass 提供的继承 extend 来实现。本节内容我们将讲解 Sass 继承的语法以及继承的多重延伸等等&#xff0…

【无功功率控制】连接到无限电网的小型风电场的无功功率控制(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MongoDB【常用命令】

目录 1&#xff1a;基本常用命令 1.1&#xff1a;演示案例 1.2&#xff1a;数据库操作 1.2.1&#xff1a;选择和创建数据库&#xff0c;查看当前正在使用的数据库命令 1.2.2&#xff1a;数据库的删除 1.3&#xff1a;集合操作 1.3.1&#xff1a;集合的显式创建&#xff0…

安全意识培训:如何提高员工网络安全意识?

随着网络技术的不断发展和应用&#xff0c;网络安全已经成为企业必须关注和重视的问题。尤其是在今天&#xff0c;企业数字化转型的大背景下&#xff0c;网络安全问题日益凸显。对于企业而言&#xff0c;员工是企业安全的第一道防线&#xff0c;提高员工的网络安全意识已经成为…