Spring Boot 2.X版本配置swagger并解决访问404的问题

服务应用提供的接口很重要,文档也很重要,调用者需要通过文档才能正确使用服务接口。Swagger是一个很好的接口文档工具,但是使用时也难免遇到一些问题。

配置Swagger

和引入其他第三方工具一样,引入依赖、添加配置。

  • 在项目的 pom.xml 里引入依赖

<dependency>
	<groupId>io.springfoxgroupId>
	<artifactId>springfox-swagger2artifactId>
	<version>2.9.2version>
dependency>


<dependency>
	<groupId>io.springfoxgroupId>
	<artifactId>springfox-swagger-uiartifactId>
	<version>2.9.2version>
dependency>
  • 开启并配置依赖
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //swagger要扫描的包
                .apis(RequestHandlerSelectors.basePackage("com.xp.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("接口Demo")
                .description("视频投票、查看排行等应用接口说明")
                .termsOfServiceUrl("localhost:18080/tvbox")
                .contact(new Contact("视频投票接口Demo","localhost:18080/tvbox/swagger-ui.html","[email protected]"))
                .version("1.0")
                .build();
    }
}

很多博客内会写到这里,然后跟你说:嗯,少年,你的Swagger可以访问了,快去感受吧。。然鹅你会发现服务器不想跟你说话并向你抛了个 404 ,下面开始解决这个问题。

解决404问题

  • 在Swagger的配置类 SwaggerConfig 中加上静态资源路径映射
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}

到这里可以去试一试你的Swagger接口文档了,此时使用是没问题了,但是如果你看服务的输出日志的话,可能会发现有错误,可能是:
Illegal DefaultValue for parameter type integer

这个主要是因为 swagger 主依赖包还依赖着 swagger-models ,这个依赖包1.5.20 版本有bug,把它排除,自己引入高版本的就行了,修改 pom.xml 就行了:


<dependency>
	<groupId>io.springfoxgroupId>
	<artifactId>springfox-swagger2artifactId>
	<version>2.9.2version>
	<exclusions>
		<exclusion>
			<groupId>io.swaggergroupId>
			<artifactId>swagger-modelsartifactId>
		exclusion>
	exclusions>
dependency>



<dependency>
	<groupId>io.swaggergroupId>
	<artifactId>swagger-modelsartifactId>
	<version>1.5.23version>
dependency>

现在重启服务后再访问 Swagger 时就不会出现问题了。

此时看上去风平浪静。如果应用是一个纯粹的 REST Api 接口服务,那就基本没什么问题,但如果应用中仍然有视图模板、静态资源时,可能就会出现加载不到静态资源了。如果出现这个问题,那只要在Swagger配置类 SwaggerConfig 中加上静态资源路径映射即可:

//路径根据自己的项目去做映射
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");

或者可以单独用一个配置视图模板解析、静态资源访问路径映射的配置类:

@ComponentScan
@Configuration
@EnableWebMvc
public class WebViewConfig implements WebMvcConfigurer {

    /**
     * 注册html视图解析器
     */
    @Bean
    public ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setTemplateMode("HTML");
        templateResolver.setPrefix("classpath:/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setCharacterEncoding("utf-8");
        templateResolver.setCacheable(false);
        return templateResolver;
    }

    /**
     * 将自定义tml视图解析器添加到模板引擎并主持到ioc
     */
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        return templateEngine;
    }
    /**
     * Thymeleaf视图解析器配置
     */
    @Bean
    public ThymeleafViewResolver viewResolverThymeLeaf() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("utf-8");
        viewResolver.setViewNames(new String[]{"thymeleaf"});
        viewResolver.setOrder(1);
        return viewResolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    /**
     * 配置静态文件映射
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

		//根据自己项目的实际路径去配置        
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/**").addResourceLocations("/WEB-INF/static/");
    }
}

这样配置完应该就能成功的访问自己的应用,同时也可以正常使用Swagger了。

  • 本篇文字原创,解决方法网上很多,参考了其他一些博客,只是把遇到的问题和解决方法整合了一下,如有错误,望各位指正。

参考文档:
配置swagger: https://www.jianshu.com/p/3d191671b349
解决404:https://blog.csdn.net/xqnode/article/details/81382160
解决报错:https://blog.csdn.net/boyin333/article/details/87980108

你可能感兴趣的:(Spring Boot 2.X版本配置swagger并解决访问404的问题)