问题描述:
问题背景:
- Spring Cloud项目(但这个问题的发生和 是Cloud还是Boot 没关系),
- 增加了spring security(Oauth2)
- 封装了返回数据的格式
问题现象:
- 配置swagger后,发现ui无法打开,但是v2/api-docs文件还可以被返回。
- api-doc文件的json格式外又多包裹了一层。
- 查看console发现某些文件被拦截了
问题解决:
尝试过的对本项目无效的解决办法:
- 将swagger版本从2.9.2 -> 2.7.2换成更低版本后,虽然ui界面无拦截弹出框,但没有任何数据。
- 因为使用了Oauth2,所以考虑会不会把.css等一些文件拦截了,于是将各种.css, .js文件格式加入http.antMatchers白名单中
有效解决办法:
1 第一步:
将swagger返回的文件加入到Oauth2 Config白名单中:
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable().cors().disable();
http
.authorizeRequests()
.antMatchers(
"/swagger-ui.html",
"/webjars/**",
"/v2/api-docs",
"/swagger-resources/**",
"/favicon.ico"
).permitAll()
.and()
.authorizeRequests()
.anyRequest().hasAuthority("AUTHORITY-USER");
2 第二步:
是因为返回的数据被封装好了,返回的ui中的body格式也默认被封装在了自设定的格式里,所以无法显示数据
因此需要在返回数据的GlobalResponseConfig里声明一下,将swagger返回的数据不要经过Response<>(body).build();的封装
// 直接返回swagger返回的数据body本身
if (body instanceof UiConfiguration) return body;
if (body instanceof SecurityConfiguration) return body;
if (body instanceof ArrayList && !((ArrayList<?>) body).isEmpty() && ((ArrayList<?>) body).get(0) instanceof SwaggerResource)
return body;
if (body instanceof Json) return body;
// 自设定的返回数据的封装
if (body instanceof Status) return new Response<>().status((Status) body).build();
if (body instanceof Response<?>) return ((Response<?>) body).build();
return new Response<>(body).build();