spring boot 和swagger2版本冲突

spring boot 和swagger2版本冲突

版本说明:

spring boot: 3.0.2


问题描述:

引入swagger2并配置好后,针对swagger2 - 2.x和3.x分别报错

1、swagger2引入2.x版本(发生了雪崩式的连锁报错)

https://img1.sycdn.imooc.com//climg/6492c29a0917648015520538.jpg

2、swagger2引入3.x版本

java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present

https://img1.sycdn.imooc.com//climg/6492c2dc093feb3311380371.jpg


原因:

spring boot 3.x版本和swagger2 不兼容


解决办法一:

降低spring boot版本为2.x


解决办法二:(我采用的第二种)

不使用swagger2,而使用springDoc

1、引入依赖

<dependency>
   <groupId>org.springdoc</groupId>
   <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
   <version>2.1.0</version>
</dependency>

2、配置文件OpenApiConfig

package com.tinz.mall.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

@Configuration
public class OpenApiConfig {
    @Bean
    public OpenAPI springShopOpenAPI() {

        //鉴权组件(随便起名的)
        SecurityScheme securityScheme = new SecurityScheme()
                .type(SecurityScheme.Type.HTTP)
                .scheme("bearer")//固定写法
                .bearerFormat("JWT")
                .in(SecurityScheme.In.HEADER)
                .name("Authorization");

        Components components = new Components()
                .addSecuritySchemes("bearer-jwt", securityScheme);

        //鉴权限制要求(随便起名的)
        SecurityRequirement securityRequirement = new SecurityRequirement()
                .addList("bearer-jwt", Arrays.asList("read", "write"));

        return new OpenAPI()
                // 这里的名称可以自己修改
                .info(new Info().title("慕课商城 API")
                        .description("Spring HIS application")
                        .version("v0.0.1"))
                .components(components)
                .addSecurityItem(securityRequirement);
    }

}


3、增加注解

(1)Controller注解  @Tag标注整个Controller  @Operation标注单个请求接口

package com.tinz.mall.controller;

import com.tinz.mall.common.ApiRestResponse;
import com.tinz.mall.common.Constant;
import com.tinz.mall.exception.MallException;
import com.tinz.mall.exception.MallExceptionEnum;
import com.tinz.mall.model.pojo.User;
import com.tinz.mall.model.request.AddCategoryReq;
import com.tinz.mall.service.CategoryService;
import com.tinz.mall.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * 种类Controller
 */
@Tag(name = "商品种类管理")
@RestController
public class CategoryController {

    @Resource
    UserService userService;

    @Resource
    CategoryService categoryService;


    @Operation(summary = "addCategory",description = "增加商品种类")
    @PostMapping("/admin/category/add")
    public ApiRestResponse addCategory(HttpSession session, @Valid @RequestBody AddCategoryReq addCategoryReq){
        //if(addCategoryReq.getName() == null || addCategoryReq.getType() == null || addCategoryReq.getOrderNum() == null || addCategoryReq.getParentId() == null){
        //    return ApiRestResponse.error(MallExceptionEnum.PARA_NOT_NULL);
        //}
        User currentUser = (User) session.getAttribute(Constant.MALL_USER);
        if(currentUser == null){
            return ApiRestResponse.error(MallExceptionEnum.NEED_LOGIN);
        }
        boolean adminRole = userService.checkAdminRole(currentUser);

        if(adminRole){
            try {
                categoryService.add(addCategoryReq);
                return ApiRestResponse.success();
            } catch (MallException e) {
                throw new RuntimeException(e);
            }
        }else{
            return ApiRestResponse.error(MallExceptionEnum.NEED_ADMIN);
        }
    }
}



(2)实体注解  @Schema

package com.tinz.mall.model.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

@Schema(description = "分类")
public class AddCategoryReq {
    @Schema(description = "分类目录名称,2~5个字符")
    @Size(min=2, max=5, message = "name长度2-5之间")
    @NotNull(message = "name不能为null")
    private String name;

    @Schema(description = "分类目录级别,最小为1,最大为3")
    @NotNull(message = "type不能为null")
    @Max(value = 3, message = "type最大为3")
    private Integer type;

    @Schema(description = "父目录id")
    @NotNull(message = "parentId不能为null")
    private Integer parentId;

    @Schema(description = "目录展示时的排序")
    @NotNull(message = "orderNum不能为null")
    private Integer orderNum;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public Integer getOrderNum() {
        return orderNum;
    }

    public void setOrderNum(Integer orderNum) {
        this.orderNum = orderNum;
    }
}


还有很多注解,可以自己查官方文档,比如

@Parameters和@Parameter 用于标识请求参数


4、启动项目(端口写自己的)

http://localhost:8082/swagger-ui/index.html

https://img1.sycdn.imooc.com//climg/6492c4f609777b8217441208.jpg




正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小尤 2023-06-21 17:46:39

同学独立发现了问题并解决,也分享了解决问题的心得,很棒呐,继续加油!

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师