Skip to content

Commit ac0cd26

Browse files
author
springdoc
committed
fixes #163
1 parent a92f802 commit ac0cd26

File tree

9 files changed

+213
-5
lines changed

9 files changed

+213
-5
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractParameterBuilder.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,11 @@ Schema calculateSchema(Components components, java.lang.reflect.Parameter parame
147147
RequestBodyInfo requestBodyInfo, JsonView jsonView) {
148148
Schema schemaN;
149149
Class<?> schemaImplementation = null;
150-
Type returnType = null;
150+
Type paramType = null;
151151
JavaType ct = null;
152152

153153
if (parameter != null) {
154-
returnType = parameter.getParameterizedType();
154+
paramType = parameter.getParameterizedType();
155155
ct = constructType(parameter.getType());
156156
schemaImplementation = parameter.getType();
157157
}
@@ -162,12 +162,12 @@ Schema calculateSchema(Components components, java.lang.reflect.Parameter parame
162162
return schemaN;
163163
}
164164

165-
if (returnType instanceof ParameterizedType) {
166-
ParameterizedType parameterizedType = (ParameterizedType) returnType;
165+
if (paramType instanceof ParameterizedType) {
166+
ParameterizedType parameterizedType = (ParameterizedType) paramType;
167167
if (isFile(parameterizedType)) {
168168
return extractFileSchema(paramName, requestBodyInfo);
169169
}
170-
schemaN = SpringDocAnnotationsUtils.extractSchema(components, returnType, jsonView);
170+
schemaN = calculateSchemaFromParameterizedType( components, paramType, jsonView);
171171
} else {
172172
schemaN = SpringDocAnnotationsUtils.resolveSchemaFromType(schemaImplementation, components, jsonView);
173173
}
@@ -179,6 +179,8 @@ Schema calculateSchema(Components components, java.lang.reflect.Parameter parame
179179
return schemaN;
180180
}
181181

182+
protected abstract Schema calculateSchemaFromParameterizedType(Components components, Type returnType, JsonView jsonView);
183+
182184
private Schema extractFileSchema(String paramName, RequestBodyInfo requestBodyInfo) {
183185
Schema schemaN = getFileSchema(requestBodyInfo);
184186
ArraySchema schemafile = new ArraySchema();

springdoc-openapi-common/src/test/java/org/springdoc/subclass/ParameterBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package org.springdoc.subclass;
22

3+
import com.fasterxml.jackson.annotation.JsonView;
34
import com.fasterxml.jackson.databind.JavaType;
5+
import io.swagger.v3.oas.models.Components;
6+
import io.swagger.v3.oas.models.media.Schema;
47
import org.springdoc.core.AbstractParameterBuilder;
58
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
69

710
import java.lang.reflect.ParameterizedType;
11+
import java.lang.reflect.Type;
812

913
/**
1014
* Class which sub class AbstractParameterBuilder in a different package and makes sure base class access is not changed. .
@@ -15,6 +19,11 @@ public ParameterBuilder(LocalVariableTableParameterNameDiscoverer localSpringDoc
1519
super(localSpringDocParameterNameDiscoverer);
1620
}
1721

22+
@Override
23+
protected Schema calculateSchemaFromParameterizedType(Components components, Type returnType, JsonView jsonView) {
24+
return null;
25+
}
26+
1827
@Override
1928
protected boolean isFile(ParameterizedType parameterizedType) {
2029
return false;

springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/ParameterBuilder.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package org.springdoc.core;
22

3+
import com.fasterxml.jackson.annotation.JsonView;
34
import com.fasterxml.jackson.databind.JavaType;
5+
import io.swagger.v3.oas.models.Components;
6+
import io.swagger.v3.oas.models.media.Schema;
47
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
58
import org.springframework.http.codec.multipart.FilePart;
69
import org.springframework.stereotype.Component;
710
import org.springframework.web.multipart.MultipartFile;
11+
import reactor.core.publisher.Flux;
12+
import reactor.core.publisher.Mono;
813

914
import java.lang.reflect.ParameterizedType;
1015
import java.lang.reflect.Type;
@@ -17,6 +22,19 @@ public ParameterBuilder(LocalVariableTableParameterNameDiscoverer localSpringDoc
1722
super(localSpringDocParameterNameDiscoverer);
1823
}
1924

25+
@Override
26+
protected Schema calculateSchemaFromParameterizedType(Components components, Type paramType, JsonView jsonView) {
27+
Schema schemaN = null;
28+
ParameterizedType parameterizedType = (ParameterizedType) paramType;
29+
if (Mono.class.getName().contentEquals(parameterizedType.getRawType().getTypeName())
30+
|| Flux.class.getName().contentEquals(parameterizedType.getRawType().getTypeName()))
31+
schemaN = SpringDocAnnotationsUtils.extractSchema(components, parameterizedType.getActualTypeArguments()[0],
32+
jsonView);
33+
else
34+
schemaN = SpringDocAnnotationsUtils.extractSchema(components, paramType, jsonView);
35+
return schemaN;
36+
}
37+
2038
public boolean isFile(ParameterizedType parameterizedType) {
2139
Type type = parameterizedType.getActualTypeArguments()[0];
2240
if (MultipartFile.class.getName().equals(type.getTypeName())
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package test.org.springdoc.api.app5;
2+
3+
import org.springframework.http.MediaType;
4+
import org.springframework.web.bind.annotation.PostMapping;
5+
import org.springframework.web.bind.annotation.RequestBody;
6+
import org.springframework.web.bind.annotation.RestController;
7+
import reactor.core.publisher.Mono;
8+
9+
@RestController
10+
public class HelloController {
11+
12+
@PostMapping(value = "/tweets/does-not-work", consumes = MediaType.APPLICATION_JSON_VALUE)
13+
public Mono<Tweet> postNotWorks(@RequestBody Mono<Tweet> tweet) {
14+
return tweet;
15+
}
16+
17+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package test.org.springdoc.api.app5;
2+
3+
import test.org.springdoc.api.AbstractSpringDocTest;
4+
5+
public class SpringDocApp5Test extends AbstractSpringDocTest {
6+
7+
8+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package test.org.springdoc.api.app5;
2+
3+
import io.swagger.v3.oas.models.Components;
4+
import io.swagger.v3.oas.models.OpenAPI;
5+
import io.swagger.v3.oas.models.info.Info;
6+
import io.swagger.v3.oas.models.info.License;
7+
import io.swagger.v3.oas.models.security.SecurityScheme;
8+
import org.springframework.boot.SpringApplication;
9+
import org.springframework.boot.autoconfigure.SpringBootApplication;
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.context.annotation.ComponentScan;
12+
13+
@SpringBootApplication
14+
@ComponentScan(basePackages = {"org.springdoc", "test.org.springdoc.api.app5"})
15+
public class SpringDocTestApp {
16+
public static void main(String[] args) {
17+
SpringApplication.run(SpringDocTestApp.class, args);
18+
}
19+
20+
@Bean
21+
public OpenAPI customOpenAPI() {
22+
return new OpenAPI()
23+
.components(new Components().addSecuritySchemes("basicScheme",
24+
new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("basic")))
25+
.info(new Info().title("Tweet API").version("v0")
26+
.license(new License().name("Apache 2.0").url("http://springdoc.org")));
27+
}
28+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package test.org.springdoc.api.app5;
2+
3+
import javax.validation.constraints.NotBlank;
4+
import javax.validation.constraints.NotNull;
5+
import javax.validation.constraints.Size;
6+
import java.util.Date;
7+
8+
public class Tweet {
9+
private String id;
10+
11+
@NotBlank
12+
@Size(max = 140)
13+
private String text;
14+
15+
@NotNull
16+
private Date createdAt = new Date();
17+
18+
19+
public String getId() {
20+
return id;
21+
}
22+
23+
public void setId(String id) {
24+
this.id = id;
25+
}
26+
27+
public String getText() {
28+
return text;
29+
}
30+
31+
public void setText(String text) {
32+
this.text = text;
33+
}
34+
35+
public Date getCreatedAt() {
36+
return createdAt;
37+
}
38+
39+
public void setCreatedAt(Date createdAt) {
40+
this.createdAt = createdAt;
41+
}
42+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "Tweet API",
5+
"license": {
6+
"name": "Apache 2.0",
7+
"url": "http://springdoc.org"
8+
},
9+
"version": "v0"
10+
},
11+
"servers": [
12+
{
13+
"url": "",
14+
"description": "Generated server url"
15+
}
16+
],
17+
"paths": {
18+
"/tweets/does-not-work": {
19+
"post": {
20+
"operationId": "postNotWorks",
21+
"requestBody": {
22+
"content": {
23+
"application/json": {
24+
"schema": {
25+
"$ref": "#/components/schemas/Tweet"
26+
}
27+
}
28+
}
29+
},
30+
"responses": {
31+
"200": {
32+
"description": "default response",
33+
"content": {
34+
"*/*": {
35+
"schema": {
36+
"$ref": "#/components/schemas/Tweet"
37+
}
38+
}
39+
}
40+
}
41+
}
42+
}
43+
}
44+
},
45+
"components": {
46+
"schemas": {
47+
"Tweet": {
48+
"required": [
49+
"createdAt",
50+
"text"
51+
],
52+
"type": "object",
53+
"properties": {
54+
"id": {
55+
"type": "string"
56+
},
57+
"text": {
58+
"maxLength": 140,
59+
"minLength": 0,
60+
"type": "string"
61+
},
62+
"createdAt": {
63+
"type": "string",
64+
"format": "date-time"
65+
}
66+
}
67+
}
68+
},
69+
"securitySchemes": {
70+
"basicScheme": {
71+
"type": "http",
72+
"scheme": "basic"
73+
}
74+
}
75+
}
76+
}

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/ParameterBuilder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package org.springdoc.core;
22

3+
import com.fasterxml.jackson.annotation.JsonView;
34
import com.fasterxml.jackson.databind.JavaType;
5+
import io.swagger.v3.oas.models.Components;
6+
import io.swagger.v3.oas.models.media.Schema;
47
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
58
import org.springframework.stereotype.Component;
69
import org.springframework.web.multipart.MultipartFile;
@@ -16,6 +19,11 @@ public ParameterBuilder(LocalVariableTableParameterNameDiscoverer localSpringDoc
1619
super(localSpringDocParameterNameDiscoverer);
1720
}
1821

22+
@Override
23+
protected Schema calculateSchemaFromParameterizedType(Components components, Type paramType, JsonView jsonView) {
24+
return SpringDocAnnotationsUtils.extractSchema(components, paramType, jsonView);
25+
}
26+
1927
public boolean isFile(ParameterizedType parameterizedType) {
2028
Type type = parameterizedType.getActualTypeArguments()[0];
2129
if (MultipartFile.class.getName().equals(type.getTypeName())) {

0 commit comments

Comments
 (0)