springfox-swagger-ui 3.0.0 配置Swagger
配置maven
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
设置resourceHandler
package com.zhianchen.common.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.support.controller.ca.authc.TokenInterceptor; import com.support.controller.ca.authz.RequiresPermissionsInterceptor; /** * 拦截器配置类 * @author xka * */ @Configuration public class InterceptorConfigurer extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 super.addInterceptors(registry); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // registry.addResourceHandler("swagger-ui.html") // .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); //兼容3.0的 registry.addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") .resourceChain(false); } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController( "/swagger-ui/") .setViewName("forward:" + "/swagger-ui/index.html"); } }
设置Swagger 扫描包的范围
package com.zhianchen.client; //import com.google.common.base.Predicate; //import com.google.common.base.Predicates; 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.context.annotation.Profile; import org.springframework.util.ReflectionUtils; import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; import springfox.documentation.RequestHandler; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; //import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; @Configuration //@EnableSwagger2 //@EnableOpenApi @Profile({"local","dev"}) public class Swagger2 { @Bean public Docket docketHarmonyApi() { return new Docket(DocumentationType.SWAGGER_2) .groupName("鸿蒙服务接口") .apiInfo(apiInfo()) .globalOperationParameters(setHeaderToken()) .select() .apis(RequestHandlerSelectors.basePackage("com.zhianchen.harmony.controller")) //.paths(PathSelectors.any()) .paths(path -> path.startsWith("/")) .build(); } @Bean public Docket docketCommunityApi() { return new Docket(DocumentationType.SWAGGER_2) .groupName("公共接口") .apiInfo(apiInfo()) .globalOperationParameters(setHeaderToken()) .select() .apis(RequestHandlerSelectors.basePackage("com.zhianchen.community.controller")) .paths(PathSelectors.any()) .build(); } /** * 获取swagger创建初始化信息 * @return */ private ApiInfo apiInfo() { Contact contact = new Contact("", "", ""); return new ApiInfoBuilder().title("swagger 测试文档").description("dev").contact(contact) .version("1.0.0").build(); } private List<Parameter> setHeaderToken() { ParameterBuilder tokenPar = new ParameterBuilder(); List<Parameter> pars = new ArrayList<>(); tokenPar.name("token").description("token").modelRef(new ModelRef("string")).parameterType("header").build(); pars.add(tokenPar.build()); return pars; } // 解决空指针异常 @Bean public static 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; } private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) { List<T> copy = mappings.stream() .filter(mapping -> mapping.getPatternParser() == null) .collect(Collectors.toList()); mappings.clear(); mappings.addAll(copy); } @SuppressWarnings("unchecked") 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); } } }; } }
注意: 注销掉@EnableSwagger2
不然你会看到 空白的 , 提示
No operations defined in spec!
以下这种也会出现上诉错误
@Configuration //@EnableSwagger2 //@EnableOpenApi @Profile({"local","dev"}) public class Swagger2 { Predicate<RequestHandler> selector1 =RequestHandlerSelectors.basePackage("com.zhianchen.wechat"); Predicate<RequestHandler> selector2 =RequestHandlerSelectors.basePackage("com.zhianchen.platform"); Predicate<RequestHandler> selector3 = RequestHandlerSelectors.basePackage("com.zhianchen.system"); Predicate<RequestHandler> selector4 = RequestHandlerSelectors.basePackage("com.zhianchen.community");
@Bean
public Docket createRestApi() {
PredicateAdapter predicateAdapter1 = new PredicateAdapter(selector1);
PredicateAdapter predicateAdapter2 = new PredicateAdapter(selector2);
PredicateAdapter predicateAdapter3 = new PredicateAdapter(selector3);
PredicateAdapter predicateAdapter4 = new PredicateAdapter(selector4);
return new Docket(DocumentationType.SWAGGER_2).groupName("pc接口")
//加载配置信息
.apiInfo(apiInfo())
.globalOperationParameters(setHeaderToken())
.select()
//加载swagger 扫描包
.apis(Predicates.or(predicateAdapter1,predicateAdapter2,predicateAdapter3,predicateAdapter4))
//.apis(selector1).apis(selector2).apis(selector3).apis(selector4)
//.apis(Predicates.or((com.google.common.base.Predicate)selector3,(com.google.common.base.Predicate)selector4)) //.or(selector3).or(selector4)
.paths(PathSelectors.any())
//.paths(path -> path.startsWith("/"))
.build();
}
Unable to render this definition
The provided definition does not specify a valid version field.
Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: "2.0" and those that match openapi: 3.0.n (for example, openapi: 3.0.0).
浙公网安备 33010602011771号