Skip to content

Commit

Permalink
enhacement for #1128
Browse files Browse the repository at this point in the history
  • Loading branch information
bnasslahsen committed Apr 7, 2021
1 parent 3d88e14 commit 31dae33
Show file tree
Hide file tree
Showing 10 changed files with 314 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.time.Duration;
import java.time.LocalTime;
import java.util.ArrayList;
Expand Down Expand Up @@ -131,10 +133,34 @@ private static Stream<MethodParameter> extractFrom(Class<?> clazz, String fieldN
private static Stream<MethodParameter> fromGetterOfField(Class<?> paramClass, Field field, String fieldNamePrefix) {
if (isSimpleType(field.getType()))
return fromSimpleClass(paramClass, field, fieldNamePrefix);
else if (field.getGenericType() instanceof TypeVariable<?>)
return extractTypeParameter(paramClass, (TypeVariable<?>) field.getGenericType(), field, fieldNamePrefix);
else
return extractFrom(field.getType(), fieldNamePrefix + field.getName() + ".");
}

/**
* Extract type parameter stream.
*
* @param owningClass the owning class
* @param genericType the generic type
* @param field the field
* @param fieldNamePrefix the field name prefix
* @return the stream
*/
private static Stream<MethodParameter> extractTypeParameter(
Class<?> owningClass,
TypeVariable<?> genericType,
Field field,
String fieldNamePrefix) {

Type resolvedType = ReturnTypeParser.resolveType(genericType, owningClass);
if (resolvedType instanceof Class<?> && isSimpleType((Class<?>) resolvedType)) {
return fromSimpleClass(owningClass, field, fieldNamePrefix);
}
return Stream.empty();
}

/**
* From simple class stream.
*
Expand Down Expand Up @@ -262,4 +288,4 @@ private static Nullable getNullable() {
return null;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -191,10 +191,10 @@ default Type getReturnType(MethodParameter methodParameter) {
* @return the type
*/
static Type getType(MethodParameter methodParameter) {
if (methodParameter.getGenericParameterType() instanceof ParameterizedType)
return ReturnTypeParser.resolveType(methodParameter.getGenericParameterType(), methodParameter.getContainingClass());
Type genericParameterType = methodParameter.getGenericParameterType();
if (genericParameterType instanceof ParameterizedType || genericParameterType instanceof TypeVariable )
return ReturnTypeParser.resolveType(genericParameterType, methodParameter.getContainingClass());
return methodParameter.getParameterType();
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package test.org.springdoc.api.app155;

public class AbstractIntParameterObject<T extends Integer> {

int primitiveBaseField;

T genericField;

public int getPrimitiveBaseField() {
return primitiveBaseField;
}

public void setPrimitiveBaseField(int primitiveBaseField) {
this.primitiveBaseField = primitiveBaseField;
}

public T getGenericField() {
return genericField;
}

public void setGenericField(T genericField) {
this.genericField = genericField;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package test.org.springdoc.api.app155;

import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;

public class AbstractParameterObject<T extends Enum<T>> {

int primitiveBaseField;

@Parameter(schema=@Schema(type = "string", allowableValues = {"ONE", "TWO"}) )
T genericField;

public int getPrimitiveBaseField() {
return primitiveBaseField;
}

public void setPrimitiveBaseField(int primitiveBaseField) {
this.primitiveBaseField = primitiveBaseField;
}

public T getGenericField() {
return genericField;
}

public void setGenericField(T genericField) {
this.genericField = genericField;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package test.org.springdoc.api.app155;



enum ConcreteEnum {
ONE,
TWO

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package test.org.springdoc.api.app155;

public class ConcreteIntParameterObject extends AbstractIntParameterObject<Integer>{

int primitiveConcreteField;

public int getPrimitiveConcreteField() {
return primitiveConcreteField;
}

public void setPrimitiveConcreteField(int primitiveConcreteField) {
this.primitiveConcreteField = primitiveConcreteField;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package test.org.springdoc.api.app155;

public class ConcreteParameterObject extends AbstractParameterObject<ConcreteEnum> {

int primitiveConcreteField;

public int getPrimitiveConcreteField() {
return primitiveConcreteField;
}

public void setPrimitiveConcreteField(int primitiveConcreteField) {
this.primitiveConcreteField = primitiveConcreteField;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
*
* * Copyright 2019-2020 the original author or authors.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * https://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/

package test.org.springdoc.api.app155;

import org.springdoc.api.annotations.ParameterObject;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

@GetMapping( "/test1")
public ResponseEntity<String> sayHello( @ParameterObject final ConcreteParameterObject test) {
System.out.println("Field B = " + test);
return new ResponseEntity<String>("{\"Say\": \"Hello\"}", HttpStatus.OK);
}

@GetMapping( "/test2")
public ResponseEntity<String> sayHello( @ParameterObject final ConcreteIntParameterObject test) {
System.out.println("Field B = " + test);
return new ResponseEntity<String>("{\"Say\": \"Hello\"}", HttpStatus.OK);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
*
* * Copyright 2019-2020 the original author or authors.
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * https://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
*
*/

package test.org.springdoc.api.app155;


import test.org.springdoc.api.AbstractSpringDocTest;

import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
* Tests Spring meta-annotations as method parameters
*/
public class SpringDocApp155Test extends AbstractSpringDocTest {

@SpringBootApplication
static class SpringDocTestApp {}

}
117 changes: 117 additions & 0 deletions springdoc-openapi-webmvc-core/src/test/resources/results/app155.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
{
"openapi": "3.0.1",
"info": {
"title": "OpenAPI definition",
"version": "v0"
},
"servers": [
{
"url": "http://localhost",
"description": "Generated server url"
}
],
"paths": {
"/test2": {
"get": {
"tags": [
"hello-controller"
],
"operationId": "sayHello",
"parameters": [
{
"name": "primitiveConcreteField",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
},
{
"name": "primitiveBaseField",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
},
{
"name": "genericField",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"*/*": {
"schema": {
"type": "string"
}
}
}
}
}
}
},
"/test1": {
"get": {
"tags": [
"hello-controller"
],
"operationId": "sayHello_1",
"parameters": [
{
"name": "primitiveConcreteField",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
},
{
"name": "primitiveBaseField",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"format": "int32"
}
},
{
"name": "genericField",
"in": "query",
"required": false,
"schema": {
"type": "string",
"enum": [
"ONE",
"TWO"
]
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"*/*": {
"schema": {
"type": "string"
}
}
}
}
}
}
}
},
"components": {}
}

0 comments on commit 31dae33

Please sign in to comment.