22
33import com .google .common .base .Predicate ;
44import com .google .common .base .Predicates ;
5+ import com .google .common .collect .Lists ;
56import org .springframework .beans .BeansException ;
67import org .springframework .beans .factory .BeanFactory ;
78import org .springframework .beans .factory .BeanFactoryAware ;
89import org .springframework .beans .factory .config .ConfigurableBeanFactory ;
910import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
11+ import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
1012import org .springframework .context .annotation .Bean ;
1113import org .springframework .context .annotation .Configuration ;
14+ import org .springframework .context .annotation .Import ;
1215import springfox .documentation .builders .ApiInfoBuilder ;
16+ import springfox .documentation .builders .ParameterBuilder ;
1317import springfox .documentation .builders .PathSelectors ;
1418import springfox .documentation .builders .RequestHandlerSelectors ;
19+ import springfox .documentation .schema .ModelRef ;
1520import springfox .documentation .service .ApiInfo ;
1621import springfox .documentation .service .Contact ;
22+ import springfox .documentation .service .Parameter ;
1723import springfox .documentation .spi .DocumentationType ;
1824import springfox .documentation .spring .web .plugins .Docket ;
1925
2026import java .util .ArrayList ;
2127import java .util .LinkedList ;
2228import java .util .List ;
29+ import java .util .Set ;
30+ import java .util .stream .Collectors ;
2331
2432/**
2533 * @author 翟永超
26- * Create date :2017/8/7.
34+ * Create date:2017/8/7.
2735 * My blog: http://blog.didispace.com
2836 */
2937@ Configuration
38+ @ Import ({
39+ Swagger2Configuration .class
40+ })
3041public class SwaggerAutoConfiguration implements BeanFactoryAware {
3142
3243 private BeanFactory beanFactory ;
@@ -39,11 +50,12 @@ public SwaggerProperties swaggerProperties() {
3950
4051 @ Bean
4152 @ ConditionalOnMissingBean
53+ @ ConditionalOnProperty (name = "swagger.enabled" , matchIfMissing = true )
4254 public List <Docket > createRestApi (SwaggerProperties swaggerProperties ) {
4355 ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory ) beanFactory ;
4456
4557 // 没有分组
46- if (swaggerProperties .getDocket ().size () == 0 ) {
58+ if (swaggerProperties .getDocket ().size () == 0 ) {
4759 ApiInfo apiInfo = new ApiInfoBuilder ()
4860 .title (swaggerProperties .getTitle ())
4961 .description (swaggerProperties .getDescription ())
@@ -58,23 +70,26 @@ public List<Docket> createRestApi(SwaggerProperties swaggerProperties) {
5870
5971 // base-path处理
6072 // 当没有配置任何path的时候,解析/**
61- if (swaggerProperties .getBasePath ().isEmpty ()) {
73+ if (swaggerProperties .getBasePath ().isEmpty ()) {
6274 swaggerProperties .getBasePath ().add ("/**" );
6375 }
6476 List <Predicate <String >> basePath = new ArrayList ();
65- for (String path : swaggerProperties .getBasePath ()) {
77+ for (String path : swaggerProperties .getBasePath ()) {
6678 basePath .add (PathSelectors .ant (path ));
6779 }
6880
6981 // exclude-path处理
7082 List <Predicate <String >> excludePath = new ArrayList ();
71- for (String path : swaggerProperties .getExcludePath ()) {
83+ for (String path : swaggerProperties .getExcludePath ()) {
7284 excludePath .add (PathSelectors .ant (path ));
7385 }
7486
87+
7588 Docket docket = new Docket (DocumentationType .SWAGGER_2 )
7689 .host (swaggerProperties .getHost ())
7790 .apiInfo (apiInfo )
91+ .globalOperationParameters (buildGlobalOperationParametersFromSwaggerProperties (
92+ swaggerProperties .getGlobalOperationParameters ()))
7893 .select ()
7994 .apis (RequestHandlerSelectors .basePackage (swaggerProperties .getBasePackage ()))
8095 .paths (
@@ -91,7 +106,7 @@ public List<Docket> createRestApi(SwaggerProperties swaggerProperties) {
91106
92107 // 分组创建
93108 List <Docket > docketList = new LinkedList <>();
94- for (String groupName : swaggerProperties .getDocket ().keySet ()) {
109+ for (String groupName : swaggerProperties .getDocket ().keySet ()) {
95110 SwaggerProperties .DocketInfo docketInfo = swaggerProperties .getDocket ().get (groupName );
96111
97112 ApiInfo apiInfo = new ApiInfoBuilder ()
@@ -102,33 +117,35 @@ public List<Docket> createRestApi(SwaggerProperties swaggerProperties) {
102117 .licenseUrl (docketInfo .getLicenseUrl ().isEmpty () ? swaggerProperties .getLicenseUrl () : docketInfo .getLicenseUrl ())
103118 .contact (
104119 new Contact (
105- docketInfo .getContact ().getName ().isEmpty () ? swaggerProperties .getContact ().getName () : docketInfo .getContact ().getName (),
106- docketInfo .getContact ().getUrl ().isEmpty () ? swaggerProperties .getContact ().getUrl () : docketInfo .getContact ().getUrl (),
107- docketInfo .getContact ().getEmail ().isEmpty () ? swaggerProperties .getContact ().getEmail () : docketInfo .getContact ().getEmail ()
120+ docketInfo .getContact ().getName ().isEmpty () ? swaggerProperties .getContact ().getName () : docketInfo .getContact ().getName (),
121+ docketInfo .getContact ().getUrl ().isEmpty () ? swaggerProperties .getContact ().getUrl () : docketInfo .getContact ().getUrl (),
122+ docketInfo .getContact ().getEmail ().isEmpty () ? swaggerProperties .getContact ().getEmail () : docketInfo .getContact ().getEmail ()
108123 )
109124 )
110125 .termsOfServiceUrl (docketInfo .getTermsOfServiceUrl ().isEmpty () ? swaggerProperties .getTermsOfServiceUrl () : docketInfo .getTermsOfServiceUrl ())
111126 .build ();
112127
113128 // base-path处理
114129 // 当没有配置任何path的时候,解析/**
115- if (docketInfo .getBasePath ().isEmpty ()) {
130+ if (docketInfo .getBasePath ().isEmpty ()) {
116131 docketInfo .getBasePath ().add ("/**" );
117132 }
118133 List <Predicate <String >> basePath = new ArrayList ();
119- for (String path : docketInfo .getBasePath ()) {
134+ for (String path : docketInfo .getBasePath ()) {
120135 basePath .add (PathSelectors .ant (path ));
121136 }
122137
123138 // exclude-path处理
124139 List <Predicate <String >> excludePath = new ArrayList ();
125- for (String path : docketInfo .getExcludePath ()) {
140+ for (String path : docketInfo .getExcludePath ()) {
126141 excludePath .add (PathSelectors .ant (path ));
127142 }
128143
129144 Docket docket = new Docket (DocumentationType .SWAGGER_2 )
130145 .host (swaggerProperties .getHost ())
131146 .apiInfo (apiInfo )
147+ .globalOperationParameters (assemblyGlobalOperationParameters (swaggerProperties .getGlobalOperationParameters (),
148+ docketInfo .getGlobalOperationParameters ()))
132149 .groupName (groupName )
133150 .select ()
134151 .apis (RequestHandlerSelectors .basePackage (docketInfo .getBasePackage ()))
@@ -150,4 +167,49 @@ public List<Docket> createRestApi(SwaggerProperties swaggerProperties) {
150167 public void setBeanFactory (BeanFactory beanFactory ) throws BeansException {
151168 this .beanFactory = beanFactory ;
152169 }
170+
171+ private List <Parameter > buildGlobalOperationParametersFromSwaggerProperties (
172+ List <SwaggerProperties .GlobalOperationParameter > globalOperationParameters ) {
173+ List <Parameter > parameters = Lists .newArrayList ();
174+ for (SwaggerProperties .GlobalOperationParameter globalOperationParameter : globalOperationParameters ) {
175+ parameters .add (new ParameterBuilder ()
176+ .name (globalOperationParameter .getName ())
177+ .description (globalOperationParameter .getDescription ())
178+ .modelRef (new ModelRef (globalOperationParameter .getModelRef ()))
179+ .parameterType (globalOperationParameter .getParameterType ())
180+ .required (Boolean .parseBoolean (globalOperationParameter .getRequired ()))
181+ .build ());
182+ }
183+ return parameters ;
184+ }
185+
186+ /**
187+ * 局部参数按照name覆盖局部参数
188+ *
189+ * @param globalOperationParameters
190+ * @param docketOperationParameters
191+ * @return
192+ */
193+ private List <Parameter > assemblyGlobalOperationParameters (
194+ List <SwaggerProperties .GlobalOperationParameter > globalOperationParameters ,
195+ List <SwaggerProperties .GlobalOperationParameter > docketOperationParameters ) {
196+
197+ if (docketOperationParameters == null || docketOperationParameters .isEmpty ()) {
198+ return buildGlobalOperationParametersFromSwaggerProperties (globalOperationParameters );
199+ }
200+
201+ Set <String > docketNames = docketOperationParameters .stream ()
202+ .map (SwaggerProperties .GlobalOperationParameter ::getName )
203+ .collect (Collectors .toSet ());
204+
205+ List <SwaggerProperties .GlobalOperationParameter > resultOperationParameters = Lists .newArrayList ();
206+
207+ for (SwaggerProperties .GlobalOperationParameter parameter : globalOperationParameters ) {
208+ if (!docketNames .contains (parameter .getName ())) {
209+ resultOperationParameters .add (parameter );
210+ }
211+ }
212+ resultOperationParameters .addAll (docketOperationParameters );
213+ return buildGlobalOperationParametersFromSwaggerProperties (resultOperationParameters );
214+ }
153215}
0 commit comments