疯狂的狮子li
2022-01-13 ff4a429136ed859d3c121b164ab3dc9a4321c89b
update 升级 springboot 2.6.X 解决 springfox 兼容性问题
已修改3个文件
59 ■■■■ 文件已修改
pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -14,7 +14,7 @@
    <properties>
        <ruoyi-vue-plus.version>3.5.0</ruoyi-vue-plus.version>
        <spring-boot.version>2.5.8</spring-boot.version>
        <spring-boot.version>2.6.2</spring-boot.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
@@ -30,7 +30,7 @@
        <p6spy.version>3.9.1</p6spy.version>
        <hutool.version>5.7.18</hutool.version>
        <okhttp.version>4.9.2</okhttp.version>
        <spring-boot-admin.version>2.5.5</spring-boot-admin.version>
        <spring-boot-admin.version>2.6.0</spring-boot-admin.version>
        <redisson.version>3.16.7</redisson.version>
        <lock4j.version>2.2.1</lock4j.version>
        <dynamic-ds.version>3.5.0</dynamic-ds.version>
ruoyi-admin/src/main/resources/application.yml
@@ -79,6 +79,10 @@
  thymeleaf:
    # 将系统模板放置到最前面 否则会与 springboot-admin 页面冲突
    template-resolver-order: 1
  mvc:
    pathmatch:
      # 适配 boot 2.6 路由与 springfox 兼容
      matching-strategy: ANT_PATH_MATCHER
  jackson:
    # 日期格式化
    date-format: yyyy-MM-dd HH:mm:ss
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
@@ -7,8 +7,13 @@
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.config.properties.SwaggerProperties;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
@@ -16,8 +21,11 @@
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
import javax.annotation.PostConstruct;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
@@ -26,18 +34,45 @@
 *
 * @author Lion Li
 */
@RequiredArgsConstructor
@Configuration
@EnableKnife4j
public class SwaggerConfig {
    @Autowired
    private SwaggerProperties swaggerProperties;
    private final SwaggerProperties swaggerProperties;
    private final TokenProperties tokenProperties;
    private final OpenApiExtensionResolver openApiExtensionResolver;
    @Autowired
    private TokenProperties tokenProperties;
    /**
     * 用于适配springboot 2.6
     */
    @Bean
    @SuppressWarnings("all")
    public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }
    @Autowired
    private OpenApiExtensionResolver openApiExtensionResolver;
            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
                mappings.removeIf(mapping -> mapping.getPatternParser() != null);
            }
            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }
    /**
     * 创建API
@@ -97,7 +132,7 @@
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope authorizationScope = new AuthorizationScope("global" , "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();