diff --git a/core/src/main/java/io/smallrye/openapi/runtime/scanner/spi/AbstractParameterProcessor.java b/core/src/main/java/io/smallrye/openapi/runtime/scanner/spi/AbstractParameterProcessor.java index ff38cf693..2a19b73b9 100644 --- a/core/src/main/java/io/smallrye/openapi/runtime/scanner/spi/AbstractParameterProcessor.java +++ b/core/src/main/java/io/smallrye/openapi/runtime/scanner/spi/AbstractParameterProcessor.java @@ -660,7 +660,32 @@ void mapParameterStyle(Parameter param, ParameterContext context) { } void mapParameterSchema(Parameter param, ParameterContext context) { - if (ModelUtil.parameterHasSchema(param) || context.targetType == null) { + if (context.targetType == null) { + return; + } + + if (ModelUtil.parameterHasSchema(param)) { + Schema existingSchema = param.getSchema(); + if (existingSchema != null && existingSchema.getRef() == null && existingSchema.getType() == null) { + Schema typeSchema = SchemaFactory.typeToSchema(scannerContext, context.targetType, null); + if (typeSchema != null) { + if (typeSchema.getRef() != null) { + Schema resolved = ModelUtil.getComponent(scannerContext.getOpenApi(), typeSchema.getRef()); + if (resolved != null) { + typeSchema = resolved; + } + } + if (typeSchema.getType() != null) { + existingSchema.setType(typeSchema.getType()); + } + if (existingSchema.getEnumeration() == null && typeSchema.getEnumeration() != null) { + existingSchema.setEnumeration(typeSchema.getEnumeration()); + } + if (existingSchema.getFormat() == null && typeSchema.getFormat() != null) { + existingSchema.setFormat(typeSchema.getFormat()); + } + } + } return; } diff --git a/extension-jaxrs/src/test/java/io/smallrye/openapi/runtime/scanner/ParameterScanTests.java b/extension-jaxrs/src/test/java/io/smallrye/openapi/runtime/scanner/ParameterScanTests.java index 9768b544b..cbe4a1863 100644 --- a/extension-jaxrs/src/test/java/io/smallrye/openapi/runtime/scanner/ParameterScanTests.java +++ b/extension-jaxrs/src/test/java/io/smallrye/openapi/runtime/scanner/ParameterScanTests.java @@ -161,6 +161,31 @@ void testJakartaParameterInBeanFromField() throws IOException, JSONException { test.io.smallrye.openapi.runtime.scanner.Widget.class); } + @Test + void testBeanParamEnumDefaultValue() throws IOException, JSONException { + class QueryOptions { + @jakarta.ws.rs.QueryParam("sortOrder") + @Parameter(description = "Sort direction", schema = @Schema(defaultValue = "ASC")) + SortOrder sortOrder; + } + + @jakarta.ws.rs.Path("/beanparam-enum-default") + class ListResource { + @jakarta.ws.rs.GET + @jakarta.ws.rs.Produces(jakarta.ws.rs.core.MediaType.APPLICATION_JSON) + public String list(@jakarta.ws.rs.BeanParam QueryOptions options) { + return "ok"; + } + } + + test("params.beanparam-enum-default-value.json", SortOrder.class, QueryOptions.class, ListResource.class); + } + + enum SortOrder { + ASC, + DESC + } + @Test void testJavaxParameterInBeanFromSetter() throws IOException, JSONException { test("params.parameter-in-bean-from-setter.json", diff --git a/extension-jaxrs/src/test/resources/io/smallrye/openapi/runtime/scanner/params.beanparam-enum-default-value.json b/extension-jaxrs/src/test/resources/io/smallrye/openapi/runtime/scanner/params.beanparam-enum-default-value.json new file mode 100644 index 000000000..386fdb21f --- /dev/null +++ b/extension-jaxrs/src/test/resources/io/smallrye/openapi/runtime/scanner/params.beanparam-enum-default-value.json @@ -0,0 +1,47 @@ +{ + "openapi": "3.1.0", + "paths": { + "/beanparam-enum-default": { + "get": { + "parameters": [ + { + "name": "sortOrder", + "in": "query", + "description": "Sort direction", + "schema": { + "default": "ASC", + "enum": [ + "ASC", + "DESC" + ], + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "SortOrder": { + "enum": [ + "ASC", + "DESC" + ], + "type": "string" + } + } + } +}