diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java index 8aee2bbea..ad52bfd93 100644 --- a/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java +++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java @@ -1,17 +1,22 @@ package org.springdoc.core; -import io.swagger.v3.core.util.AnnotationsUtils; -import io.swagger.v3.core.util.ReflectionUtils; -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.Operation; -import io.swagger.v3.oas.models.Paths; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.security.SecurityScheme; -import io.swagger.v3.oas.models.servers.Server; +import static org.springdoc.core.Constants.DEFAULT_SERVER_DESCRIPTION; +import static org.springdoc.core.Constants.DEFAULT_TITLE; +import static org.springdoc.core.Constants.DEFAULT_VERSION; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,20 +32,20 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.method.HandlerMethod; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.springdoc.core.Constants.DEFAULT_SERVER_DESCRIPTION; -import static org.springdoc.core.Constants.DEFAULT_TITLE; -import static org.springdoc.core.Constants.DEFAULT_VERSION; +import io.swagger.v3.core.util.AnnotationsUtils; +import io.swagger.v3.core.util.ReflectionUtils; +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.Paths; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; public class OpenAPIBuilder { @@ -208,15 +213,7 @@ private Optional getOpenAPIDefinition() { private void buildOpenAPIWithOpenAPIDefinition(OpenAPI openAPI, OpenAPIDefinition apiDef) { // info - Optional infos = AnnotationsUtils.getInfo(apiDef.info()); - if (infos.isPresent()) { - Info info = infos.get(); - if (StringUtils.isNotBlank(info.getTitle())) { - PropertyResolverUtils propertyResolverUtils = context.getBean(PropertyResolverUtils.class); - info.title(propertyResolverUtils.resolve(info.getTitle())); - } - openAPI.setInfo(info); - } + AnnotationsUtils.getInfo(apiDef.info()).map(this::resolveProperties).ifPresent(openAPI::setInfo); // OpenApiDefinition security requirements securityParser.getSecurityRequirements(apiDef.security()).ifPresent(openAPI::setSecurity); // OpenApiDefinition external docs @@ -235,6 +232,36 @@ private void buildOpenAPIWithOpenAPIDefinition(OpenAPI openAPI, OpenAPIDefinitio } } + private Info resolveProperties(Info info) { + PropertyResolverUtils propertyResolverUtils = context.getBean(PropertyResolverUtils.class); + resolveProperty(info::getTitle, info::title, propertyResolverUtils); + resolveProperty(info::getDescription, info::description, propertyResolverUtils); + resolveProperty(info::getVersion, info::version, propertyResolverUtils); + resolveProperty(info::getTermsOfService, info::termsOfService, propertyResolverUtils); + + License license = info.getLicense(); + if (license != null) { + resolveProperty(license::getName, license::name, propertyResolverUtils); + resolveProperty(license::getUrl, license::url, propertyResolverUtils); + } + + Contact contact = info.getContact(); + if (contact != null) { + resolveProperty(contact::getName, contact::name, propertyResolverUtils); + resolveProperty(contact::getEmail, contact::email, propertyResolverUtils); + resolveProperty(contact::getUrl, contact::url, propertyResolverUtils); + } + return info; + } + + private void resolveProperty(Supplier getProperty, Consumer setProperty, + PropertyResolverUtils propertyResolverUtils) { + String value = getProperty.get(); + if (StringUtils.isNotBlank(value)) { + setProperty.accept(propertyResolverUtils.resolve(value)); + } + } + private void calculateSecuritySchemes(Components components) { // Look for OpenAPIDefinition in a spring managed bean Map securitySchemeBeans = context diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app15/SpringDocApp15Test.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app15/SpringDocApp15Test.java index b4f0280f8..9e53c84da 100644 --- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app15/SpringDocApp15Test.java +++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app15/SpringDocApp15Test.java @@ -1,15 +1,43 @@ package test.org.springdoc.api.app15; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.info.Info; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.test.context.TestPropertySource; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Contact; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; import test.org.springdoc.api.AbstractSpringDocTest; -@TestPropertySource(properties = {"springdoc.operation-descriptions.myOperation=My Desc", "springdoc.openapidefinition.info.title=My title"}) +@TestPropertySource(properties = { + "springdoc.operation-descriptions.myOperation=My Desc", + "springdoc.openapidefinition.info.title=My title", + "springdoc.openapidefinition.info.desc=My description", + "springdoc.openapidefinition.info.version=My version", + "springdoc.openapidefinition.info.terms=My terms", + "springdoc.openapidefinition.info.license.name=My license name", + "springdoc.openapidefinition.info.license.url=My license url", + "springdoc.openapidefinition.info.contact.name=My contact name", + "springdoc.openapidefinition.info.contact.email=My contact email", + "springdoc.openapidefinition.info.contact.url=My contact url" +}) public class SpringDocApp15Test extends AbstractSpringDocTest { @SpringBootApplication - @OpenAPIDefinition(info = @Info(title = "${springdoc.openapidefinition.info.title}")) + @OpenAPIDefinition(info = @Info( + title = "${springdoc.openapidefinition.info.title}", + description = "${springdoc.openapidefinition.info.desc}", + version = "${springdoc.openapidefinition.info.version}", + termsOfService = "${springdoc.openapidefinition.info.terms}", + license = @License( + name = "${springdoc.openapidefinition.info.license.name}", + url = "${springdoc.openapidefinition.info.license.url}" + ), + contact = @Contact( + name = "${springdoc.openapidefinition.info.contact.name}", + email = "${springdoc.openapidefinition.info.contact.email}", + url = "${springdoc.openapidefinition.info.contact.url}" + ) + )) static class SpringDocTestApp { } -} \ No newline at end of file +} diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/app15.json b/springdoc-openapi-webmvc-core/src/test/resources/results/app15.json index 8e7010bc4..5d6d5c0b6 100644 --- a/springdoc-openapi-webmvc-core/src/test/resources/results/app15.json +++ b/springdoc-openapi-webmvc-core/src/test/resources/results/app15.json @@ -1,7 +1,19 @@ { "openapi": "3.0.1", "info": { - "title": "My title" + "title": "My title", + "description": "My description", + "version": "My version", + "termsOfService": "My terms", + "license": { + "name": "My license name", + "url": "My license url" + }, + "contact": { + "name": "My contact name", + "email": "My contact email", + "url": "My contact url" + } }, "servers": [ {