121121import io .quarkus .vertx .http .runtime .security .SecurityHandlerPriorities ;
122122import io .smallrye .openapi .api .OpenApiConfig ;
123123import io .smallrye .openapi .api .OpenApiDocument ;
124+ import io .smallrye .openapi .api .OperationHandler ;
124125import io .smallrye .openapi .api .SmallRyeOpenAPI ;
125126import io .smallrye .openapi .api .constants .SecurityConstants ;
126127import io .smallrye .openapi .api .util .MergeUtil ;
@@ -881,7 +882,13 @@ private void registerReflectionForApiResponseSchemaSerialization(BuildProducer<R
881882 }
882883 }
883884
884- private void handleOperation (Operation operation , ClassInfo classInfo , MethodInfo method ) {
885+ /**
886+ * Callback invoked by the smallrye-open-api annotation scanner for each discovered API
887+ * operation. We use this to set a (private) extension in the OpenAPI model which is then
888+ * used by the {@link OperationFilter} to match operations with the security and
889+ * tag information discovered earlier in the build by this class.
890+ */
891+ private void addMethodReferenceExtension (Operation operation , ClassInfo classInfo , MethodInfo method ) {
885892 String methodRef = createUniqueMethodReference (classInfo , method );
886893 operation .addExtension (OperationFilter .EXT_METHOD_REF , methodRef );
887894 }
@@ -906,6 +913,16 @@ public void build(BuildProducer<GeneratedResourceBuildItem> resourceBuildItemBui
906913 .map (IgnoreStaticDocumentBuildItem ::getUrlIgnorePattern )
907914 .toList ();
908915
916+ /*
917+ * Only add method references if the OperationFilter is enabled. Otherwise,
918+ * they are not needed.
919+ */
920+ OperationHandler operationHandler = openAPIBuildItems .stream ()
921+ .map (AddToOpenAPIDefinitionBuildItem ::getOASFilter )
922+ .anyMatch (OperationFilter .class ::isInstance )
923+ ? this ::addMethodReferenceExtension
924+ : OperationHandler .DEFAULT ;
925+
909926 SmallRyeOpenAPI .Builder builder = SmallRyeOpenAPI .builder ()
910927 .withConfig (config )
911928 .withIndex (index )
@@ -926,7 +943,7 @@ public void build(BuildProducer<GeneratedResourceBuildItem> resourceBuildItemBui
926943 .withScannerFilter (getScannerFilter (capabilities , index ))
927944 .withContextRootResolver (getContextRootResolver (config , capabilities , httpRootPathBuildItem ))
928945 .withTypeConverter (getTypeConverter (index , capabilities ))
929- .withOperationHandler (this :: handleOperation )
946+ .withOperationHandler (operationHandler )
930947 .enableUnannotatedPathParameters (capabilities .isPresent (Capability .RESTEASY_REACTIVE ))
931948 .enableStandardFilter (false )
932949 .withFilters (openAPIBuildItems .stream ()
0 commit comments