From 9e31a2ca18a99e23e91c247b996903df8dc98d02 Mon Sep 17 00:00:00 2001 From: Kamil Krzywanski Date: Sun, 29 Sep 2024 23:57:48 +0200 Subject: [PATCH] issue #2733 second change for only check response entity type --- .../converters/ResponseSupportConverter.java | 17 ++++++++++------ .../api/v30/app227/HelloController.java | 6 ++++++ .../v30/app227/wrapper/NoGenericWrapper.java | 11 ++++++++++ .../test/resources/results/3.0.1/app227.json | 20 +++++++++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/wrapper/NoGenericWrapper.java diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/converters/ResponseSupportConverter.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/converters/ResponseSupportConverter.java index b57c11a01..f45a69eff 100644 --- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/converters/ResponseSupportConverter.java +++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/converters/ResponseSupportConverter.java @@ -34,6 +34,7 @@ import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.media.StringSchema; import org.springdoc.core.providers.ObjectMapperProvider; +import org.springframework.http.ResponseEntity; import static org.springdoc.core.converters.ConverterUtils.isFluxTypeWrapper; import static org.springdoc.core.converters.ConverterUtils.isResponseTypeToIgnore; @@ -65,12 +66,7 @@ public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterato if (javaType != null) { Class cls = javaType.getRawClass(); if (isResponseTypeWrapper(cls) && !isFluxTypeWrapper(cls)) { - JavaType innerType = javaType.getBindings().getBoundType(0); - if(javaType.getSuperClass() !=null - && javaType.getSuperClass().hasGenericTypes() - && isResponseTypeWrapper(javaType.getSuperClass().getRawClass()) - && !Object.class.equals(javaType.getSuperClass().getBindings().getBoundType(0).getRawClass())) - innerType = javaType.getSuperClass().getBindings().getBoundType(0); + JavaType innerType = findResponseEntity(javaType).containedType(0); if (innerType == null) return new StringSchema(); return context.resolve(new AnnotatedType(innerType) @@ -83,4 +79,13 @@ else if (isResponseTypeToIgnore(cls)) } return (chain.hasNext()) ? chain.next().resolve(type, context, chain) : null; } + + private JavaType findResponseEntity(JavaType javaType){ + if(ResponseEntity.class.isAssignableFrom(javaType.getRawClass())){ + while (ResponseEntity.class != javaType.getRawClass()) + javaType = javaType.getSuperClass(); + } + return javaType; + } + } diff --git a/springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/HelloController.java b/springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/HelloController.java index 3f1938cf7..d8d9f0287 100644 --- a/springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/HelloController.java +++ b/springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/HelloController.java @@ -20,6 +20,7 @@ import test.org.springdoc.api.v30.app227.model.Item; +import test.org.springdoc.api.v30.app227.wrapper.NoGenericWrapper; import test.org.springdoc.api.v30.app227.wrapper.ResponseEntityWrapper; import org.springframework.http.HttpStatus; @@ -34,4 +35,9 @@ public ResponseEntityWrapper persons() { return new ResponseEntityWrapper<>(Item.fromPayload("1", "OK", "String"), HttpStatus.OK); } + @GetMapping("/persons2") + public NoGenericWrapper persons2() { + return new NoGenericWrapper(Item.fromPayload("1", "OK", "String"), HttpStatus.OK); + } + } diff --git a/springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/wrapper/NoGenericWrapper.java b/springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/wrapper/NoGenericWrapper.java new file mode 100644 index 000000000..c60427ce5 --- /dev/null +++ b/springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app227/wrapper/NoGenericWrapper.java @@ -0,0 +1,11 @@ +package test.org.springdoc.api.v30.app227.wrapper; + + +import org.springframework.http.HttpStatusCode; +import test.org.springdoc.api.v30.app227.model.Item; + +public class NoGenericWrapper extends ResponseEntityWrapper { + public NoGenericWrapper(Item body, HttpStatusCode status) { + super(body, status); + } +} diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app227.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app227.json index 604fe4922..5daf9e326 100644 --- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app227.json +++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app227.json @@ -30,6 +30,26 @@ } } } + }, + "/persons2": { + "get": { + "tags": [ + "hello-controller" + ], + "operationId": "persons2", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ItemString" + } + } + } + } + } + } } }, "components": {