@@ -247,10 +247,18 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
247
247
protected void calculatePath (String operationPath , Set <RequestMethod > requestMethods , io .swagger .v3 .oas .annotations .Operation apiOperation , String [] methodConsumes , String [] methodProduces , String [] headers ) {
248
248
OpenAPI openAPI = openAPIBuilder .getCalculatedOpenAPI ();
249
249
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
+ }
250
255
for (RequestMethod requestMethod : requestMethods ) {
256
+ Operation existingOperation = getExistingOperation (operationMap , requestMethod );
251
257
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 );
254
262
PathItem pathItemObject = buildPathItem (requestMethod , operation , operationPath , paths );
255
263
paths .addPathItem (operationPath , pathItemObject );
256
264
}
@@ -313,7 +321,7 @@ protected void getRouterFunctionPaths(String beanName, AbstractRouterFunctionVis
313
321
calculatePath (routerOperationList .stream ().map (routerOperation -> new org .springdoc .core .models .RouterOperation (routerOperation , routerFunctionVisitor .getRouterFunctionDatas ().get (0 ))).collect (Collectors .toList ()));
314
322
else {
315
323
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 );
317
325
calculatePath (operationList );
318
326
}
319
327
}
@@ -490,29 +498,89 @@ protected Operation customiseOperation(Operation operation, HandlerMethod handle
490
498
return operation ;
491
499
}
492
500
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 ) {
494
502
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 ());
500
508
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
504
572
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 ]))
506
575
.collect (Collectors .toList ());
507
576
if (routerFunctionDataList .size () == 1 )
508
- fillRouterOperation (routerFunctionDataList , routerOperation );
577
+ fillRouterOperation (routerFunctionDataList . get ( 0 ) , routerOperation );
509
578
}
510
579
}
511
580
}
512
581
}
513
582
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 ) {
516
584
if (ArrayUtils .isEmpty (routerOperation .getConsumes ()))
517
585
routerOperation .setConsumes (routerFunctionData .getConsumes ());
518
586
if (ArrayUtils .isEmpty (routerOperation .getProduces ()))
0 commit comments