社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!