Skip to content

Commit 54cf8c1

Browse files
author
bnasslahsen
committed
PR#353 review
1 parent a0a181a commit 54cf8c1

File tree

5 files changed

+85
-28
lines changed

5 files changed

+85
-28
lines changed

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

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import org.springframework.web.bind.annotation.ResponseStatus;
2424
import org.springframework.web.method.HandlerMethod;
2525

26-
import java.lang.reflect.*;
26+
import java.lang.reflect.Method;
27+
import java.lang.reflect.ParameterizedType;
28+
import java.lang.reflect.Type;
2729
import java.util.*;
2830
import java.util.stream.Collectors;
2931
import java.util.stream.Stream;
@@ -342,15 +344,4 @@ private boolean isVoid(Type returnType) {
342344
return Void.TYPE.equals(returnType) || (returnType instanceof ParameterizedType
343345
&& Void.class.equals(((ParameterizedType) returnType).getActualTypeArguments()[0]));
344346
}
345-
346-
interface ReturnTypeParser {
347-
Type getReturnType(Method method);
348-
}
349-
350-
public static class GenericReturnTypeParser implements ReturnTypeParser {
351-
@Override
352-
public Type getReturnType(Method method) {
353-
return method.getGenericReturnType();
354-
}
355-
}
356347
}

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

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import io.swagger.v3.oas.models.OpenAPI;
1010
import io.swagger.v3.oas.models.Operation;
1111
import io.swagger.v3.oas.models.Paths;
12+
import io.swagger.v3.oas.models.info.Contact;
1213
import io.swagger.v3.oas.models.info.Info;
14+
import io.swagger.v3.oas.models.info.License;
1315
import io.swagger.v3.oas.models.security.SecurityScheme;
1416
import io.swagger.v3.oas.models.servers.Server;
1517
import org.apache.commons.lang3.StringUtils;
@@ -28,6 +30,8 @@
2830
import org.springframework.web.method.HandlerMethod;
2931

3032
import java.util.*;
33+
import java.util.function.Consumer;
34+
import java.util.function.Supplier;
3135
import java.util.stream.Collectors;
3236
import java.util.stream.Stream;
3337

@@ -199,15 +203,7 @@ private Optional<OpenAPIDefinition> getOpenAPIDefinition() {
199203

200204
private void buildOpenAPIWithOpenAPIDefinition(OpenAPI openAPI, OpenAPIDefinition apiDef) {
201205
// info
202-
Optional<Info> infos = AnnotationsUtils.getInfo(apiDef.info());
203-
if (infos.isPresent()) {
204-
Info info = infos.get();
205-
if (StringUtils.isNotBlank(info.getTitle())) {
206-
PropertyResolverUtils propertyResolverUtils = context.getBean(PropertyResolverUtils.class);
207-
info.title(propertyResolverUtils.resolve(info.getTitle()));
208-
}
209-
openAPI.setInfo(info);
210-
}
206+
AnnotationsUtils.getInfo(apiDef.info()).map(this::resolveProperties).ifPresent(openAPI::setInfo);
211207
// OpenApiDefinition security requirements
212208
securityParser.getSecurityRequirements(apiDef.security()).ifPresent(openAPI::setSecurity);
213209
// OpenApiDefinition external docs
@@ -226,6 +222,36 @@ private void buildOpenAPIWithOpenAPIDefinition(OpenAPI openAPI, OpenAPIDefinitio
226222
}
227223
}
228224

225+
private Info resolveProperties(Info info) {
226+
PropertyResolverUtils propertyResolverUtils = context.getBean(PropertyResolverUtils.class);
227+
resolveProperty(info::getTitle, info::title, propertyResolverUtils);
228+
resolveProperty(info::getDescription, info::description, propertyResolverUtils);
229+
resolveProperty(info::getVersion, info::version, propertyResolverUtils);
230+
resolveProperty(info::getTermsOfService, info::termsOfService, propertyResolverUtils);
231+
232+
License license = info.getLicense();
233+
if (license != null) {
234+
resolveProperty(license::getName, license::name, propertyResolverUtils);
235+
resolveProperty(license::getUrl, license::url, propertyResolverUtils);
236+
}
237+
238+
Contact contact = info.getContact();
239+
if (contact != null) {
240+
resolveProperty(contact::getName, contact::name, propertyResolverUtils);
241+
resolveProperty(contact::getEmail, contact::email, propertyResolverUtils);
242+
resolveProperty(contact::getUrl, contact::url, propertyResolverUtils);
243+
}
244+
return info;
245+
}
246+
247+
private void resolveProperty(Supplier<String> getProperty, Consumer<String> setProperty,
248+
PropertyResolverUtils propertyResolverUtils) {
249+
String value = getProperty.get();
250+
if (StringUtils.isNotBlank(value)) {
251+
setProperty.accept(propertyResolverUtils.resolve(value));
252+
}
253+
}
254+
229255
private void calculateSecuritySchemes(Components components) {
230256
// Look for OpenAPIDefinition in a spring managed bean
231257
Map<String, Object> securitySchemeBeans = context

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.lang.reflect.Method;
44
import java.lang.reflect.Type;
55

6-
public interface ReturnTypeParser {
6+
interface ReturnTypeParser {
77
default Type getReturnType(Method method) {
88
return method.getGenericReturnType();
99
}
Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,43 @@
11
package test.org.springdoc.api.app15;
22

3-
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
4-
import io.swagger.v3.oas.annotations.info.Info;
53
import org.springframework.boot.autoconfigure.SpringBootApplication;
64
import org.springframework.test.context.TestPropertySource;
5+
6+
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
7+
import io.swagger.v3.oas.annotations.info.Contact;
8+
import io.swagger.v3.oas.annotations.info.Info;
9+
import io.swagger.v3.oas.annotations.info.License;
710
import test.org.springdoc.api.AbstractSpringDocTest;
811

9-
@TestPropertySource(properties = {"springdoc.operation-descriptions.myOperation=My Desc", "springdoc.openapidefinition.info.title=My title"})
12+
@TestPropertySource(properties = {
13+
"springdoc.operation-descriptions.myOperation=My Desc",
14+
"springdoc.openapidefinition.info.title=My title",
15+
"springdoc.openapidefinition.info.desc=My description",
16+
"springdoc.openapidefinition.info.version=My version",
17+
"springdoc.openapidefinition.info.terms=My terms",
18+
"springdoc.openapidefinition.info.license.name=My license name",
19+
"springdoc.openapidefinition.info.license.url=My license url",
20+
"springdoc.openapidefinition.info.contact.name=My contact name",
21+
"springdoc.openapidefinition.info.contact.email=My contact email",
22+
"springdoc.openapidefinition.info.contact.url=My contact url"
23+
})
1024
public class SpringDocApp15Test extends AbstractSpringDocTest {
1125

1226
@SpringBootApplication
13-
@OpenAPIDefinition(info = @Info(title = "${springdoc.openapidefinition.info.title}"))
27+
@OpenAPIDefinition(info = @Info(
28+
title = "${springdoc.openapidefinition.info.title}",
29+
description = "${springdoc.openapidefinition.info.desc}",
30+
version = "${springdoc.openapidefinition.info.version}",
31+
termsOfService = "${springdoc.openapidefinition.info.terms}",
32+
license = @License(
33+
name = "${springdoc.openapidefinition.info.license.name}",
34+
url = "${springdoc.openapidefinition.info.license.url}"
35+
),
36+
contact = @Contact(
37+
name = "${springdoc.openapidefinition.info.contact.name}",
38+
email = "${springdoc.openapidefinition.info.contact.email}",
39+
url = "${springdoc.openapidefinition.info.contact.url}"
40+
)
41+
))
1442
static class SpringDocTestApp { }
15-
}
43+
}

springdoc-openapi-webmvc-core/src/test/resources/results/app15.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
11
{
22
"openapi": "3.0.1",
33
"info": {
4-
"title": "My title"
4+
"title": "My title",
5+
"description": "My description",
6+
"version": "My version",
7+
"termsOfService": "My terms",
8+
"license": {
9+
"name": "My license name",
10+
"url": "My license url"
11+
},
12+
"contact": {
13+
"name": "My contact name",
14+
"email": "My contact email",
15+
"url": "My contact url"
16+
}
517
},
618
"servers": [
719
{

0 commit comments

Comments
 (0)