解决添加上@RequiresPermissions权限注解后无法访问接口,swagger读取不到的问题

news2024/11/19 13:16:17

目录

一、先搭建 Swagger

1、添加依赖库

2、创建Swagger配置类

3、配置yml

4、编写测试Web接口

5、测试Web接口

二、解决问题

1、出现的问题

2、解决问题


一、先搭建 Swagger

开发前后端分离架构的项目,往往调试后端Web接口需要用到POSTMAN工具。虽然POSTMAN
工具的功能非常强大,但是请求参数很多的情况下,我们手写这些参数和数据还是非常麻烦的。
因此我们需要一个调试后端Web接口更加简便的方法。恰好Swagger提供了REST API调用方
式,我们不需要借助任何工具的情况下,访问Swagger页面,就可以对Web接口进行调用和调
试,这种调试方式的效率要远超POSTMAN软件。

1、添加依赖库

在 pom.xml 文件中添加Swagger依赖库,这里我们使用的是Swagger2版本,在UI方面,比
Swagger1版本要好看很多。

 		<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

2、创建Swagger配置类

package com.buba.wechatmini.common.utils;

/**
 * @author qlx
 */

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2);
        // ApiInfoBuilder 用于在Swagger界面上添加各种信息
        ApiInfoBuilder builder = new ApiInfoBuilder();
        builder.title("BUBA在线办公系统");
        ApiInfo apiInfo = builder.build();
        docket.apiInfo(apiInfo);
        // ApiSelectorBuilder 用来设置哪些类中的方法会生成到REST API中
        ApiSelectorBuilder selectorBuilder = docket.select();
        selectorBuilder.paths(PathSelectors.any()); //所有包下的类
        //使用@ApiOperation的方法会被提取到REST API中
        selectorBuilder.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class));
        docket = selectorBuilder.build();
        /*
         * 下面的语句是开启对JWT的支持,当用户用Swagger调用受JWT认证保护的方法,
         * 必须要先提交参数(例如令牌)
         */
        //存储用户必须提交的参数
        List<ApiKey> apikey = new ArrayList();
        //规定用户需要输入什么参数
        apikey.add(new ApiKey("token", "token", "header"));
        docket.securitySchemes(apikey);
        //如果用户JWT认证通过,则在Swagger中全局有效
        AuthorizationScope scope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] scopeArray = {scope};
        //存储令牌和作用域
        SecurityReference reference = new SecurityReference("token", scopeArray);
        List refList = new ArrayList();
        refList.add(reference);
        SecurityContext context =
                SecurityContext.builder().securityReferences(refList).build();
        List cxtList = new ArrayList();
        cxtList.add(context);
        docket.securityContexts(cxtList);
        return docket;
    }
}

3、配置yml

Springboot2.6以后将SpringMVC 默认路径匹配策略从AntPathMatcher 更改为PathPatternParser,导致出错如下:
ERROR Application run failed org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

解决上述问题需要application.yml配置如下

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

4、编写测试Web接口

package com.buba.wechatmini.controller;

import com.buba.wechatmini.common.utils.JwtUtil;
import com.buba.wechatmini.common.utils.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author qlx
 */
@RestController
@RequestMapping("/test")
@Api("测试Web接口")
public class TestController {

    @Autowired
    private JwtUtil jwtUtil;

    @ApiOperation("最简单的测试方法")
    @GetMapping("/get1")
    public Result get1(){
        Map map = new HashMap();
        map.put("msa","aaaaaaa");
        return Result.ok(map);
    }
    @RequestMapping(value = "/getToken",method = RequestMethod.OPTIONS)
    public Result getToken() throws UnsupportedEncodingException {
        Map map = new HashMap();
        map.put("token",jwtUtil.createToken(123));
        return Result.ok(map);
    }
}

5、测试Web接口

浏览器访问地址:http://127.0.0.1:8080/swagger-ui.html
在这里插入图片描述

二、解决问题

1、出现的问题

我如果添加上权限注解,会是什么效果呢?

 执行项目,访问swagger,发现没有访问接口了,读取不到了,那么问题就出现了

2、解决问题

在swagger配置类中添加以下
package com.WeChatMiNi.yka.config.swagger;

/**
 * @author qlx
 */

import io.swagger.annotations.ApiOperation;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * Swagger配置类
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2);
        // ApiInfoBuilder 用于在Swagger界面上添加各种信息
        ApiInfoBuilder builder = new ApiInfoBuilder();
        builder.title("BUBA在线办公系统");
        ApiInfo apiInfo = builder.build();
        docket.apiInfo(apiInfo);
        // ApiSelectorBuilder 用来设置哪些类中的方法会生成到REST API中
        ApiSelectorBuilder selectorBuilder = docket.select();
        selectorBuilder.paths(PathSelectors.any()); //所有包下的类
        //使用@ApiOperation的方法会被提取到REST API中
        selectorBuilder.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class));
        docket = selectorBuilder.build();
        /*
         * 下面的语句是开启对JWT的支持,当用户用Swagger调用受JWT认证保护的方法,
         * 必须要先提交参数(例如令牌)
         */
        //存储用户必须提交的参数
        List<ApiKey> apikey = new ArrayList();
        //规定用户需要输入什么参数
        apikey.add(new ApiKey("token", "token", "header"));
        docket.securitySchemes(apikey);
        //如果用户JWT认证通过,则在Swagger中全局有效
        AuthorizationScope scope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] scopeArray = {scope};
        //存储令牌和作用域
        SecurityReference reference = new SecurityReference("token", scopeArray);
        List refList = new ArrayList();
        refList.add(reference);
        SecurityContext context =
                SecurityContext.builder().securityReferences(refList).build();
        List cxtList = new ArrayList();
        cxtList.add(context);
        docket.securityContexts(cxtList);
        return docket;
    }

    /**
     * 解决添加上@RequiresPermissions注解后无法访问接口,swagger读取不到的问题
     * @return
     */
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator =
                new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setUsePrefix(true);

        return defaultAdvisorAutoProxyCreator;
    }
}

重启项目,再次访问,访问成功

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

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

相关文章

智安网络|人工智能蔓延,网络安全所面临的威胁和应对之道

随着人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;技术的快速发展和广泛应用&#xff0c;我们进入了一个智能时代&#xff0c;人工智能已经蔓延到我们生活的方方面面。然而&#xff0c;与其带来的方便和创新相伴随的是网络安全所面临的新威胁。 【威…

记录一下RocketMQ中遇见的 连环大坑!!!差点没把我摔死

目录 环境&#xff1a;Win10 &#xff0c; 不是 linux 首先我遇见的第一个问题是&#xff1a; No route info of this topic 问题原因&#xff1a; PS&#xff1a; 64位系统环境下&#xff0c;如果软件在安装时安装路径默认c:\progarmfiles即为64位&#xff0c;默认c:\pr…

Sharding-JDBC之PreciseShardingAlgorithm(精确分片算法)

目录 一、简介二、maven依赖三、数据库3.1、创建数据库3.2、创建表 四、配置&#xff08;二选一&#xff09;4.1、properties配置4.2、yml配置 五、精确分片算法5.1、精确分库算法5.2、精确分表算法 六、实现6.1、实体层6.2、持久层6.3、服务层6.4、测试类6.4.1、保存订单数据6…

ai画图怎么弄?简单几步教会你如何用ai绘画

艺术创作一直是人类文明发展的重要组成部分&#xff0c;在当今数字化时代&#xff0c;ai技术的不断进步也为我们带来了全新的创作方式。在这其中&#xff0c;ai绘画软件因其独特的创作方式和优秀的绘画效果受到了广泛关注和喜爱。使用ai绘画软件可以让我们轻松地创作出各种风格…

关于数据仓库那点事,一文捋清

借助海量的数据&#xff0c;企业进行了深层次的数字化改革&#xff0c;把数据当成了企业发展的核心&#xff0c;但无效的数据即使规模再大&#xff0c;也对企业没有意义&#xff0c;所以数据质量也就愈发重要。 数据仓库 事实上&#xff0c;很多人在看到数据仓库的第一眼&…

【夜深人静学数据结构与算法 | 第四篇】手撕二叉树遍历

目录 前言&#xff1a; 二叉树遍历方式&#xff1a; 手撕前中后序遍历&#xff08;递归&#xff09;的三大准备 深度优先搜索&#xff1a; 手撕前中后遍历&#xff08;递归&#xff09;&#xff1a; 手撕前中后序遍历&#xff08;迭代&#xff09;&#xff1a; 深度优先…

经典Java面试题收集

1、面向对象的特征有哪些方面&#xff1f; 答&#xff1a;面向对象的特征主要有以下几个方面&#xff1a; 抽象&#xff1a;抽象是将一类对象的共同特征总结出来构造类的过程&#xff0c;包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为&#xff0c;并不关注这…

EHCI接口概述(三)

EHCI主机接口寄存器在BAR0所示的PCI MEM地址空间中&#xff0c;主要包括两部分&#xff1a; 1&#xff09;能力寄存器组 2&#xff09;操作寄存器组 下面先介绍能力寄存器组 CAPLENGTH寄存器&#xff0c;8位只读寄存器&#xff0c;给出了控制寄存器组的偏移量。 HCIVERSION…

springboot+vue项目之CSGO赛事管理系统(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的CSGO赛事管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

C语言:求两个数二进制中不同位的个数

题目&#xff1a; 编程实现&#xff1a;两个int&#xff08;32位&#xff09;整数 m 和 n 的二进制表达中&#xff0c;有多少个位(bit)不同&#xff1f; 输入例子 : 1999 2299 输出例子 : 7 思路&#xff1a; 总体思路&#xff1a; 把 m 异或 n 后&#xff0c;有几个相异就有几…

抢占父亲节市场:2023年出海品牌的海外网红营销策略揭秘

随着社交媒体的迅猛发展和全球化的趋势&#xff0c;网红营销已经成为品牌推广的一种重要方式。在父亲节这个特殊的节日里&#xff0c;出海品牌可以通过巧妙利用网红的影响力来推动产品销售和品牌知名度的提升。本文Nox聚星将详细介绍如何通过海外网红营销来提升品牌知名度和销售…

HarmonyOS学习路之开发篇—Java UI框架(动画开发)

动画开发 动画是组件的基础特性之一&#xff0c;精心设计的动画使UI变化更直观&#xff0c;有助于改进应用程序的外观并改善用户体验。Java UI框架提供了帧动画、数值动画和属性动画&#xff0c;并提供了将多个动画同时操作的动画集合。 帧动画 帧动画是利用视觉暂留现象&…

[电离层建模学习笔记]开源程序M_GIM学习记录

[电离层建模学习笔记]开源程序M_GIM学习记录 文章目录 [电离层建模学习笔记]开源程序M_GIM学习记录1. 程序相关信息2. 程序学习记录2.1 采用的数据说明2.2 程序运行前2.3 程序运行结果 3. 其他 1. 程序相关信息 开源程序M_GIM基于Matlab(Zhou et al., 2023)&#xff0c;用于实…

js数组高阶函数——includes()方法

js数组高阶函数——includes方法 前言数组的一般化操作创建数组获取数组长度访问&#xff08;遍历&#xff09;数组元素修改数组元素删除数组元素数组尾部添加数组尾部删除 includes&#xff08;&#xff09;方法举例说明关键点 前言 ⭐JS的数组是一种特殊的对象&#xff0c;其…

SSH通过VSCode远程访问服务器Opencv和matplotlib等无法直接显示图像问题

需求描述&#xff1a; 在VSCode中通过SSH连接服务器&#xff0c;使用cv2.imshow或plt.show()无法显示图像。 解决思路如下&#xff1a; 1、首先查看与服务器之间的网络连接问题&#xff08;百分之九十问题就是出在第一步骤&#xff0c;哈哈哈&#xff09; 在本地端打开cmd&…

「案例」95后占半壁江山的浙桂,如何在百家争鸣中快人一步

如果用一个历史时期来形容目前国内单光子雪崩二极管&#xff08;SPAD&#xff09;传感器芯片的市场格局&#xff0c;那就是——春秋。 各家IC设计公司百家争鸣&#xff0c;而浙桂半导体就是其中的“百分之一”。 浙桂半导体两大特点 一、浙桂研发SPAD传感器芯片需要召唤像元、…

C语言实现字符串的模式匹配

一.模式匹配 字符串的模式匹配算法是用来查找一个字符串中是否存在另一个指定的字符串&#xff08;即模式&#xff09;的算法。常见的模式匹配算法包括暴力匹配算法、KMP算法、Boyer-Moore算法和Rabin-Karp算法。 暴力匹配算法&#xff1a;暴力匹配算法也称为朴素匹配算法&am…

自学黑客!一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图以编程为基础的学习开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不多 一…

【Java之JAR包解析】(三)除核心包 rt.jar之外的其他JAR包~

JAR包解析之其他jar包 前言:one: access-bridge-64.jar:two: charsets.jar:three: cldrdata.jar:four: deploy.jar:five: jce.jar:six: jfr.jar:seven: jfxrt.jar:eight: jfxswt.jar:nine: jsse.jar:keycap_ten: localedata.jar11、management-agent.jar12、nashorn.jar13、plu…

开发人员Git仓库提交与合并

参考&#xff1a;git 的变基(rebase)和合并(merge)具体有什么分别阿&#xff1f; - 知乎 1、Git工作流 在使用Git Flow工作模式时&#xff0c;业界普遍遵循的规则&#xff1a; 所有开发分支从develop分支拉取。所有hotfix分支从master分支拉取。所有在master分支上的提交都必…