@@ -247,10 +247,18 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
247247 protected void calculatePath (String operationPath , Set <RequestMethod > requestMethods , io .swagger .v3 .oas .annotations .Operation apiOperation , String [] methodConsumes , String [] methodProduces , String [] headers ) {
248248 OpenAPI openAPI = openAPIBuilder .getCalculatedOpenAPI ();
249249 Paths paths = openAPI .getPaths ();
250+ Map <HttpMethod , Operation > operationMap = null ;
251+ if (paths .containsKey (operationPath )) {
252+ PathItem pathItem = paths .get (operationPath );
253+ operationMap = pathItem .readOperationsMap ();
254+ }
250255 for (RequestMethod requestMethod : requestMethods ) {
256+ Operation existingOperation = getExistingOperation (operationMap , requestMethod );
251257 MethodAttributes methodAttributes = new MethodAttributes (springDocConfigProperties .getDefaultConsumesMediaType (), springDocConfigProperties .getDefaultProducesMediaType (), methodConsumes , methodProduces , headers );
252- Operation operation = new Operation ();
253- openAPI = operationParser .parse (apiOperation , operation , openAPI , methodAttributes );
258+ methodAttributes .setMethodOverloaded (existingOperation != null );
259+ Operation operation = (existingOperation != null ) ? existingOperation : new Operation ();
260+ if (apiOperation != null )
261+ openAPI = operationParser .parse (apiOperation , operation , openAPI , methodAttributes );
254262 PathItem pathItemObject = buildPathItem (requestMethod , operation , operationPath , paths );
255263 paths .addPathItem (operationPath , pathItemObject );
256264 }
@@ -313,7 +321,7 @@ protected void getRouterFunctionPaths(String beanName, AbstractRouterFunctionVis
313321 calculatePath (routerOperationList .stream ().map (routerOperation -> new org .springdoc .core .models .RouterOperation (routerOperation , routerFunctionVisitor .getRouterFunctionDatas ().get (0 ))).collect (Collectors .toList ()));
314322 else {
315323 List <org .springdoc .core .models .RouterOperation > operationList = routerOperationList .stream ().map (org .springdoc .core .models .RouterOperation ::new ).collect (Collectors .toList ());
316- merge (routerFunctionVisitor .getRouterFunctionDatas (), operationList );
324+ mergeRouters (routerFunctionVisitor .getRouterFunctionDatas (), operationList );
317325 calculatePath (operationList );
318326 }
319327 }
@@ -490,29 +498,89 @@ protected Operation customiseOperation(Operation operation, HandlerMethod handle
490498 return operation ;
491499 }
492500
493- protected void merge (List <RouterFunctionData > routerFunctionDatas , List <org .springdoc .core .models .RouterOperation > routerOperationList ) {
501+ protected void mergeRouters (List <RouterFunctionData > routerFunctionDatas , List <org .springdoc .core .models .RouterOperation > routerOperationList ) {
494502 for (org .springdoc .core .models .RouterOperation routerOperation : routerOperationList ) {
495- List < RouterFunctionData > routerFunctionDataList = routerFunctionDatas . stream ()
496- . filter ( routerFunctionData1 -> routerFunctionData1 . getPath (). equals ( routerOperation . getPath ()))
497- . collect ( Collectors . toList ());
498- if (! CollectionUtils . isEmpty ( routerFunctionDataList )) {
499- //Try with unique path in the route
503+ if ( StringUtils . isNotBlank ( routerOperation . getPath ())) {
504+ // PATH
505+ List < RouterFunctionData > routerFunctionDataList = routerFunctionDatas . stream ()
506+ . filter ( routerFunctionData1 -> routerFunctionData1 . getPath (). equals ( routerOperation . getPath ()))
507+ . collect ( Collectors . toList ());
500508 if (routerFunctionDataList .size () == 1 )
501- fillRouterOperation (routerFunctionDataList , routerOperation );
502- //Try with unique path and RequestMethod
503- else {
509+ fillRouterOperation (routerFunctionDataList .get (0 ), routerOperation );
510+ else if (routerFunctionDataList .size () > 1 && ArrayUtils .isNotEmpty (routerOperation .getMethod ())) {
511+ // PATH + METHOD
512+ routerFunctionDataList = routerFunctionDatas .stream ()
513+ .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ())
514+ && routerFunctionData1 .getMethods ()[0 ].equals (routerOperation .getMethod ()[0 ]))
515+ .collect (Collectors .toList ());
516+ if (routerFunctionDataList .size () == 1 )
517+ fillRouterOperation (routerFunctionDataList .get (0 ), routerOperation );
518+ else if (routerFunctionDataList .size () > 1 && ArrayUtils .isNotEmpty (routerOperation .getProduces ())) {
519+ // PATH + METHOD + PRODUCES
520+ routerFunctionDataList = routerFunctionDatas .stream ()
521+ .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ())
522+ && routerFunctionData1 .getMethods ()[0 ].equals (routerOperation .getMethod ()[0 ])
523+ && routerFunctionData1 .getProduces ()[0 ].equals (routerOperation .getProduces ()[0 ]))
524+ .collect (Collectors .toList ());
525+ if (routerFunctionDataList .size () == 1 )
526+ fillRouterOperation (routerFunctionDataList .get (0 ), routerOperation );
527+ else if (routerFunctionDataList .size () > 1 && ArrayUtils .isNotEmpty (routerOperation .getConsumes ())) {
528+ // PATH + METHOD + PRODUCES + CONSUMES
529+ routerFunctionDataList = routerFunctionDatas .stream ()
530+ .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ())
531+ && routerFunctionData1 .getMethods ()[0 ].equals (routerOperation .getMethod ()[0 ])
532+ && routerFunctionData1 .getProduces ()[0 ].equals (routerOperation .getProduces ()[0 ])
533+ && routerFunctionData1 .getConsumes ()[0 ].equals (routerOperation .getConsumes ()[0 ]))
534+ .collect (Collectors .toList ());
535+ if (routerFunctionDataList .size () == 1 )
536+ fillRouterOperation (routerFunctionDataList .get (0 ), routerOperation );
537+ }
538+ }
539+ else if (routerFunctionDataList .size () > 1 && ArrayUtils .isNotEmpty (routerOperation .getConsumes ())) {
540+ // PATH + METHOD + CONSUMES
541+ routerFunctionDataList = routerFunctionDatas .stream ()
542+ .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ())
543+ && routerFunctionData1 .getMethods ()[0 ].equals (routerOperation .getMethod ()[0 ])
544+ && routerFunctionData1 .getConsumes ()[0 ].equals (routerOperation .getConsumes ()[0 ]))
545+ .collect (Collectors .toList ());
546+ if (routerFunctionDataList .size () == 1 )
547+ fillRouterOperation (routerFunctionDataList .get (0 ), routerOperation );
548+ }
549+ }
550+ else if (routerFunctionDataList .size () > 1 && ArrayUtils .isNotEmpty (routerOperation .getProduces ())) {
551+ // PATH + PRODUCES
552+ routerFunctionDataList = routerFunctionDatas .stream ()
553+ .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ())
554+ && routerFunctionData1 .getProduces ()[0 ].equals (routerOperation .getProduces ()[0 ]))
555+ .collect (Collectors .toList ());
556+ if (routerFunctionDataList .size () == 1 )
557+ fillRouterOperation (routerFunctionDataList .get (0 ), routerOperation );
558+ else if (routerFunctionDataList .size () > 1 && ArrayUtils .isNotEmpty (routerOperation .getConsumes ())) {
559+ // PATH + PRODUCES + CONSUMES
560+ routerFunctionDataList = routerFunctionDatas .stream ()
561+ .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ())
562+ && routerFunctionData1 .getMethods ()[0 ].equals (routerOperation .getMethod ()[0 ])
563+ && routerFunctionData1 .getConsumes ()[0 ].equals (routerOperation .getConsumes ()[0 ])
564+ && routerFunctionData1 .getProduces ()[0 ].equals (routerOperation .getProduces ()[0 ]))
565+ .collect (Collectors .toList ());
566+ if (routerFunctionDataList .size () == 1 )
567+ fillRouterOperation (routerFunctionDataList .get (0 ), routerOperation );
568+ }
569+ }
570+ else if (routerFunctionDataList .size () > 1 && ArrayUtils .isNotEmpty (routerOperation .getConsumes ())) {
571+ // PATH + CONSUMES
504572 routerFunctionDataList = routerFunctionDatas .stream ()
505- .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ()) && ArrayUtils .isNotEmpty (routerOperation .getMethod ()) && routerFunctionData1 .getMethods ()[0 ].equals (routerOperation .getMethod ()[0 ]))
573+ .filter (routerFunctionData1 -> routerFunctionData1 .getPath ().equals (routerOperation .getPath ())
574+ && routerFunctionData1 .getConsumes ()[0 ].equals (routerOperation .getConsumes ()[0 ]))
506575 .collect (Collectors .toList ());
507576 if (routerFunctionDataList .size () == 1 )
508- fillRouterOperation (routerFunctionDataList , routerOperation );
577+ fillRouterOperation (routerFunctionDataList . get ( 0 ) , routerOperation );
509578 }
510579 }
511580 }
512581 }
513582
514- private void fillRouterOperation (List <RouterFunctionData > routerFunctionDataList , org .springdoc .core .models .RouterOperation routerOperation ) {
515- RouterFunctionData routerFunctionData = routerFunctionDataList .get (0 );
583+ private void fillRouterOperation (RouterFunctionData routerFunctionData , org .springdoc .core .models .RouterOperation routerOperation ) {
516584 if (ArrayUtils .isEmpty (routerOperation .getConsumes ()))
517585 routerOperation .setConsumes (routerFunctionData .getConsumes ());
518586 if (ArrayUtils .isEmpty (routerOperation .getProduces ()))
0 commit comments