SpringBoot整合Swagger问题整理 - Go语言中文社区

SpringBoot整合Swagger问题整理


1、swagger版本与springboot版本

本项目使用的是Swagger版本是2.7.0,该版本对应的spring版本是4.3.10,所使用的SpringBoot版本在1.5.6.RELEASE版本左右都是可以的。一般版本差距太大才会导致冲突。

2、按步骤导入jar包,添加配置类后,启动时未报错,但访问http://localhost:8080/swagger-ui.html时页面显示空白,如下:

查看控制台并无报错,查看log日志也无明显错误信息,访问http://localhost:8080/v2/api-docs发现有返回值但是只有一个key为value的json串返回,因此有可能是对返回值处理时出现了问题。查询资料得知有可能有fastjson有关,而项目中之前为了处理返回日期类型为时间戳,自定义了HttpMessageConverter,里面有用到fastjson包中JSON对象,注解掉相关代码:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    super.configureMessageConverters(converters);
    converters.add(responseBodyConverter());
    // converters.add(new MappingHttpMessageConverter());
}

重启服务器可正常显示,不过时间日期返回变为时间戳。

3、SpringBoot集成Swagger后时间日期返回设置格式

网上有多种解决方案,这里找到了一种相同简便且可行的方案,采用FastJsonHttpMessageConverter进行消息转化,如下所示:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    super.configureMessageConverters(converters);
    converters.add(responseBodyConverter());
        
    // 1.定义一个convert 转换消息的对象
    FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    // 2 添加fastjson 的配置信息 比如 是否要格式化 返回的json数据
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
    fastConverter.setFastJsonConfig(fastJsonConfig);
    // 解决乱码的问题
    List<MediaType> fastMediaTypes = new ArrayList<>();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    fastConverter.setSupportedMediaTypes(fastMediaTypes);
    converters.add(fastConverter);
}

利用FastJsonConfig可设置日期的格式,经测试可行。

4、关于页面空白需添加静态资源映射问题

本项目未遇到该问题,经测试是否添加都不会产生影响,这里只贴出该配置代码,如有遇到相似问题也可尝试:

    @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/");
        super.addResourceHandlers(registry);
    }

新增:SpringBoot升级到2.2.0.RELEASE版本,swagger使用(com.battcn:swagger-spring-boot-starter:2.1.2-RELEASE)

swagger默认扫描包路径是全部,所有可以在配置文件加spring.swagger.base-package指定扫描路径,启动类添加@EnableSwagger2注解即完成默认的配置。

问题1描述:由于之前自定义了SwaggerConfig配置类,配置了Docket,启动项目报错,提示:

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.IllegalStateException: Multiple Dockets with the same group name are not supported. The following duplicate groups were discovered. default

解决方案:该报错信息提示相同groupName的Docket存在多个配置,swagger默认会生成groupName=default的Docket,很显然这里是由于自定义Docket时忽略了groupName的配置,修复如下(网上有很多说是因为guava版本冲突,swagger的starter中确实也存在多个不同的guava版本,可自行申明统一版本):

new Docket(DocumentationType.SWAGGER_2).groupName("myDocketDef")...

问题2描述:使用拦截器之后,swagger的静态资源也可能被拦截导致拦截器处理抛出handler转换异常,静态资源处理器是ResourceHttpRequestHandler,直接强转HandlerMethod会报错

解决方案:拦截器配置里排除静态path,经测试去除拦截"/static/**"即可,(SpringBoot2.0,Spring5+,JDK8)WebMvcConfigurer中有默认方法的实现,Spring推荐直接实现该类完成自定义的mvc配置,如下代码所示:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> excludePaths = Arrays.asList("/static/**", "/swagger-ui.html", "/swagger-resources");
        registry.addInterceptor(new GlobalInterceptor()).addPathPatterns("/**")
            .excludePathPatterns(excludePaths);
    }

PS:有一种替代方案是,在拦截器中判断if (handler isinstanceof ResourceRequestHandler)

问题3描述:上述问题解决之后,发现返回的日期格式相差了8个小时且时间格式和指定的yyyy-MM-dd HH:mm:ss不一致,之前数据库时间已设置Asia/Shanghai且从db查到的日期是正确的,判断是因为时区处理的问题,之前FastJsonConfig配置并未生效

解决方案:使用SpringBoot自带的jackson解决方案即可实现,无需自行配置HttpMessageConverter,在配置文件中添加两行配置:

spring.jackson.time-zone=Asia/Shanghai
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/congge_1993/article/details/82629266
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 17:55:42
  • 阅读 ( 1917 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢