2525import org .springframework .beans .factory .annotation .Autowired ;
2626import org .springframework .core .annotation .Order ;
2727import org .springframework .stereotype .Component ;
28+ import org .springframework .util .ClassUtils ;
2829import springfox .documentation .builders .ExampleBuilder ;
2930import springfox .documentation .builders .ModelSpecificationBuilder ;
3031import springfox .documentation .builders .RequestParameterBuilder ;
3334import springfox .documentation .schema .ModelKey ;
3435import springfox .documentation .schema .ModelKeyBuilder ;
3536import springfox .documentation .schema .ModelSpecification ;
37+ import springfox .documentation .schema .ScalarType ;
3638import springfox .documentation .schema .ScalarTypes ;
3739import springfox .documentation .service .AllowableValues ;
3840import springfox .documentation .service .CollectionFormat ;
4648
4749import java .util .ArrayList ;
4850import java .util .List ;
51+ import java .util .Objects ;
4952import java .util .Optional ;
53+ import java .util .function .Function ;
5054import java .util .function .Predicate ;
5155import java .util .stream .Collectors ;
56+ import java .util .stream .Stream ;
5257
5358import static java .util .Optional .*;
5459import static org .slf4j .LoggerFactory .*;
@@ -135,8 +140,8 @@ static Compatibility<springfox.documentation.service.Parameter, RequestParameter
135140 );
136141 }
137142
138- private static Compatibility <springfox .documentation .schema .ModelRef , ModelSpecification >
139- maybeGetModelRef ( ApiImplicitParam param ) {
143+ private static Compatibility <springfox .documentation .schema .ModelRef , ModelSpecification > maybeGetModelRef (
144+ ApiImplicitParam param ) {
140145 String dataType = ofNullable (param .dataType ())
141146 .filter (((Predicate <String >) String ::isEmpty ).negate ())
142147 .orElse ("string" );
@@ -156,45 +161,60 @@ static Compatibility<springfox.documentation.service.Parameter, RequestParameter
156161 new springfox .documentation .schema .ModelRef (dataType , allowableValues ), modelSpecification );
157162 }
158163
159- private static ModelSpecification modelSpecification (
160- ApiImplicitParam param ) {
161- Class <?> clazz ;
164+ static ModelSpecification modelSpecification (ApiImplicitParam param ) {
165+ ModelSpecification scalarModel = null ;
166+ ModelSpecification referenceModel = null ;
162167 try {
163- param . dataTypeClass () ;
168+ Class <?> clazz ;
164169 if (param .dataTypeClass () != Void .class ) {
165170 clazz = param .dataTypeClass ();
166171 } else {
167- clazz = Class .forName (param .dataType ());
172+ clazz = ClassUtils .forName (param .dataType (), null );
168173 }
174+ scalarModel = ScalarTypes .builtInScalarType (clazz )
175+ .map (scalarModel (param ))
176+ .orElse (null );
177+
178+ ModelKey dataTypeKey = new ModelKeyBuilder ()
179+ .qualifiedModelName (q ->
180+ q .namespace (safeGetPackageName (clazz ))
181+ .name (clazz .getSimpleName ()))
182+ .build ();
183+ referenceModel = referenceModelSpecification (dataTypeKey , param .allowMultiple ());
184+
169185 } catch (ClassNotFoundException e ) {
170186 LOGGER .warn (
171187 "Unable to interpret the implicit parameter configuration with dataType: {}, dataTypeClass: {}" ,
172188 param .dataType (),
173189 param .dataTypeClass ());
174- return null ;
175190 }
176- ModelSpecification modelSpecification = ScalarTypes .builtInScalarType (clazz )
177- .map (scalar -> {
178- if (param .allowMultiple ()) {
179- return new ModelSpecificationBuilder ()
180- .collectionModel (c ->
181- c .model (m ->
182- m .scalarModel (scalar ))
183- .collectionType (CollectionType .LIST ))
184- .build ();
185- }
186- return new ModelSpecificationBuilder ()
187- .scalarModel (scalar )
188- .build ();
189- })
191+ ModelSpecification scalarFromType = ScalarType .from (param .type (), param .format ())
192+ .map (scalarModel (param ))
190193 .orElse (null );
191- if (modelSpecification == null ) {
192- ModelKey dataTypeKey = new ModelKeyBuilder ()
193- .qualifiedModelName (q -> q .namespace (safeGetPackageName (clazz )).name (clazz .getSimpleName ()))
194+
195+ return Stream .of (scalarModel , referenceModel , scalarFromType )
196+ .filter (Objects ::nonNull )
197+ .findFirst ()
198+ .orElse (null );
199+ }
200+
201+ private static Function <ScalarType , ModelSpecification > scalarModel (ApiImplicitParam param ) {
202+ return scalar -> {
203+ if (scalar == null ) {
204+ return null ;
205+ }
206+ if (param .allowMultiple ()) {
207+ return new ModelSpecificationBuilder ()
208+ .collectionModel (c ->
209+ c .model (m ->
210+ m .scalarModel (scalar ))
211+ .collectionType (CollectionType .LIST ))
212+ .build ();
213+ }
214+ return new ModelSpecificationBuilder ()
215+ .scalarModel (scalar )
194216 .build ();
195- modelSpecification = referenceModelSpecification (dataTypeKey , param .allowMultiple ());
196- }
197- return modelSpecification ;
217+ };
198218 }
199219
200220 private static ModelSpecification referenceModelSpecification (
@@ -215,8 +235,8 @@ private static ModelSpecification referenceModelSpecification(
215235 .build ();
216236 }
217237
218- private List <Compatibility <springfox .documentation .service .Parameter , RequestParameter >>
219- readParameters ( OperationContext context ) {
238+ private List <Compatibility <springfox .documentation .service .Parameter , RequestParameter >> readParameters (
239+ OperationContext context ) {
220240 Optional <ApiImplicitParam > annotation = context .findAnnotation (ApiImplicitParam .class );
221241 List <Compatibility <springfox .documentation .service .Parameter , RequestParameter >> parameters = new ArrayList <>();
222242 annotation .ifPresent (
0 commit comments