Skip to content

Commit 1a3c5ce

Browse files
committed
@tag name parameter not consistently performing lookup on properties file. Fixes springdoc#1351.
1 parent 6725f08 commit 1a3c5ce

File tree

30 files changed

+312
-141
lines changed

30 files changed

+312
-141
lines changed

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

+27-16
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ public class OpenAPIService {
146146
*/
147147
private String serverBaseUrl;
148148

149+
/**
150+
* The Property resolver utils.
151+
*/
152+
private PropertyResolverUtils propertyResolverUtils;
153+
149154
private static Class<?> basicErrorController;
150155

151156
static {
@@ -187,6 +192,7 @@ public class OpenAPIService {
187192
this.isServersPresent = true;
188193
}
189194
this.context = context;
195+
this.propertyResolverUtils = context.getBean(PropertyResolverUtils.class);
190196
this.securityParser = securityParser;
191197
this.springDocConfigProperties = springDocConfigProperties;
192198
this.openApiBuilderCustomisers = openApiBuilderCustomisers;
@@ -297,10 +303,9 @@ public Operation buildTags(HandlerMethod handlerMethod, Operation operation, Ope
297303
Set<io.swagger.v3.oas.models.tags.Tag> tags = new HashSet<>();
298304
Set<String> tagsStr = new HashSet<>();
299305

300-
buildTagsFromClass(handlerMethod.getBeanType(), tags, tagsStr);
301-
buildTagsFromMethod(handlerMethod.getMethod(), tags, tagsStr);
306+
buildTagsFromClass(handlerMethod.getBeanType(), tags, tagsStr,locale);
307+
buildTagsFromMethod(handlerMethod.getMethod(), tags, tagsStr,locale);
302308

303-
PropertyResolverUtils propertyResolverUtils = context.getBean(PropertyResolverUtils.class);
304309
if (!CollectionUtils.isEmpty(tagsStr))
305310
tagsStr = tagsStr.stream()
306311
.map(str -> propertyResolverUtils.resolve(str, locale))
@@ -347,30 +352,40 @@ public Operation buildTags(HandlerMethod handlerMethod, Operation operation, Ope
347352
* @param method the method
348353
* @param tags the tags
349354
* @param tagsStr the tags str
355+
* @param locale the locale
350356
*/
351-
private void buildTagsFromMethod(Method method, Set<io.swagger.v3.oas.models.tags.Tag> tags, Set<String> tagsStr) {
357+
private void buildTagsFromMethod(Method method, Set<io.swagger.v3.oas.models.tags.Tag> tags, Set<String> tagsStr, Locale locale) {
352358
// method tags
353359
Set<Tags> tagsSet = AnnotatedElementUtils
354360
.findAllMergedAnnotations(method, Tags.class);
355361
Set<Tag> methodTags = tagsSet.stream()
356362
.flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet());
357363
methodTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(method, Tag.class));
358364
if (!CollectionUtils.isEmpty(methodTags)) {
359-
tagsStr.addAll(methodTags.stream().map(Tag::name).collect(Collectors.toSet()));
365+
tagsStr.addAll(methodTags.stream().map(tag -> propertyResolverUtils.resolve(tag.name(), locale)).collect(Collectors.toSet()));
360366
List<Tag> allTags = new ArrayList<>(methodTags);
361-
AnnotationsUtils
362-
.getTags(allTags.toArray(new Tag[0]), true).ifPresent(tags::addAll);
367+
addTags(allTags, tags, locale);
363368
}
364369
}
365370

371+
private void addTags(List<Tag> sourceTags, Set<io.swagger.v3.oas.models.tags.Tag> tags, Locale locale) {
372+
Optional<Set<io.swagger.v3.oas.models.tags.Tag>> optionalTagSet = AnnotationsUtils
373+
.getTags(sourceTags.toArray(new Tag[0]), false);
374+
optionalTagSet.ifPresent(tagsSet -> {
375+
tagsSet.forEach(tag -> tag.name(propertyResolverUtils.resolve(tag.getName(), locale)));
376+
tags.addAll(tagsSet);
377+
});
378+
}
379+
366380
/**
367381
* Build tags from class.
368382
*
369383
* @param beanType the bean type
370384
* @param tags the tags
371385
* @param tagsStr the tags str
386+
* @param locale the locale
372387
*/
373-
public void buildTagsFromClass(Class<?> beanType, Set<io.swagger.v3.oas.models.tags.Tag> tags, Set<String> tagsStr) {
388+
public void buildTagsFromClass(Class<?> beanType, Set<io.swagger.v3.oas.models.tags.Tag> tags, Set<String> tagsStr, Locale locale) {
374389
List<Tag> allTags = new ArrayList<>();
375390
// class tags
376391
Set<Tags> tagsSet = AnnotatedElementUtils
@@ -379,31 +394,29 @@ public void buildTagsFromClass(Class<?> beanType, Set<io.swagger.v3.oas.models.t
379394
.flatMap(x -> Stream.of(x.value())).collect(Collectors.toSet());
380395
classTags.addAll(AnnotatedElementUtils.findAllMergedAnnotations(beanType, Tag.class));
381396
if (!CollectionUtils.isEmpty(classTags)) {
382-
tagsStr.addAll(classTags.stream().map(Tag::name).collect(Collectors.toSet()));
397+
tagsStr.addAll(classTags.stream().map(tag -> propertyResolverUtils.resolve(tag.name(), locale)).collect(Collectors.toSet()));
383398
allTags.addAll(classTags);
384-
AnnotationsUtils
385-
.getTags(allTags.toArray(new Tag[0]), true).ifPresent(tags::addAll);
399+
addTags(allTags, tags, locale);
386400
}
387401
}
388402

389403
/**
390404
* Resolve properties schema.
391405
*
392406
* @param schema the schema
393-
* @param propertyResolverUtils the property resolver utils
394407
* @param locale the locale
395408
* @return the schema
396409
*/
397410
@SuppressWarnings("unchecked")
398-
public Schema resolveProperties(Schema schema, PropertyResolverUtils propertyResolverUtils, Locale locale) {
411+
public Schema resolveProperties(Schema schema, Locale locale) {
399412
resolveProperty(schema::getName, schema::name, propertyResolverUtils, locale);
400413
resolveProperty(schema::getTitle, schema::title, propertyResolverUtils, locale);
401414
resolveProperty(schema::getDescription, schema::description, propertyResolverUtils, locale);
402415

403416
Map<String, Schema> properties = schema.getProperties();
404417
if (!CollectionUtils.isEmpty(properties)) {
405418
LinkedHashMap<String, Schema> resolvedSchemas = properties.entrySet().stream().map(es -> {
406-
es.setValue(resolveProperties(es.getValue(), propertyResolverUtils, locale));
419+
es.setValue(resolveProperties(es.getValue(), locale));
407420
return es;
408421
}).collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e2,
409422
LinkedHashMap::new));
@@ -491,7 +504,6 @@ private void buildOpenAPIWithOpenAPIDefinition(OpenAPI openAPI, OpenAPIDefinitio
491504
* @return the servers
492505
*/
493506
private List<Server> resolveProperties(List<Server> servers, Locale locale) {
494-
PropertyResolverUtils propertyResolverUtils = context.getBean(PropertyResolverUtils.class);
495507
servers.forEach(server -> {
496508
resolveProperty(server::getUrl, server::url, propertyResolverUtils, locale);
497509
resolveProperty(server::getDescription, server::description, propertyResolverUtils, locale);
@@ -509,7 +521,6 @@ private List<Server> resolveProperties(List<Server> servers, Locale locale) {
509521
* @return the info
510522
*/
511523
private Info resolveProperties(Info info, Locale locale) {
512-
PropertyResolverUtils propertyResolverUtils = context.getBean(PropertyResolverUtils.class);
513524
resolveProperty(info::getTitle, info::title, propertyResolverUtils, locale);
514525
resolveProperty(info::getDescription, info::description, propertyResolverUtils, locale);
515526
resolveProperty(info::getVersion, info::version, propertyResolverUtils, locale);

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -319,19 +319,18 @@ GenericParameterService parameterBuilder(PropertyResolverUtils propertyResolverU
319319
/**
320320
* Properties resolver for schema open api customiser.
321321
*
322-
* @param propertyResolverUtils the property resolver utils
323322
* @param openAPIService the open api builder
324323
* @return the open api customiser
325324
*/
326325
@Bean
327326
@ConditionalOnProperty(SPRINGDOC_SCHEMA_RESOLVE_PROPERTIES)
328327
@Lazy(false)
329-
OpenApiCustomiser propertiesResolverForSchema(PropertyResolverUtils propertyResolverUtils, OpenAPIService openAPIService) {
328+
OpenApiCustomiser propertiesResolverForSchema(OpenAPIService openAPIService) {
330329
return openApi -> {
331330
Components components = openApi.getComponents();
332331
Map<String, Schema> schemas = components.getSchemas();
333332
if (!CollectionUtils.isEmpty(schemas))
334-
schemas.values().forEach(schema -> openAPIService.resolveProperties(schema, propertyResolverUtils, Locale.getDefault()));
333+
schemas.values().forEach(schema -> openAPIService.resolveProperties(schema, Locale.getDefault()));
335334
};
336335
}
337336

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/SpringRepositoryRestResourceProvider.java

+12-15
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public List<RouterOperation> getRouterOperations(OpenAPI openAPI, Locale locale)
214214
handlerMappingList = getHandlerMappingList();
215215
for (Class<?> domainType : repositories) {
216216
Class<?> repository = repositories.getRequiredRepositoryInformation(domainType).getRepositoryInterface();
217-
DataRestRepository dataRestRepository = new DataRestRepository(domainType, repository);
217+
DataRestRepository dataRestRepository = new DataRestRepository(domainType, repository, locale);
218218
ResourceMetadata resourceMetadata = mappings.getMetadataFor(domainType);
219219
final PersistentEntity<?, ?> entity = persistentEntities.getRequiredPersistentEntity(domainType);
220220
dataRestRepository.setPersistentEntity(entity);
@@ -232,7 +232,7 @@ public List<RouterOperation> getRouterOperations(OpenAPI openAPI, Locale locale)
232232
.filter(controller -> !AbstractOpenApiResource.isHiddenRestControllers(controller.getValue().getBeanType()))
233233
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a1, a2) -> a1));
234234
dataRestRepository.setControllerType(ControllerType.ENTITY);
235-
findControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI, locale);
235+
findControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI);
236236

237237
Map<RequestMappingInfo, HandlerMethod> handlerMethodMapFilteredMethodMap = handlerMethodMap.entrySet().stream()
238238
.filter(requestMappingInfoHandlerMethodEntry -> REPOSITORY_PROPERTY_CONTROLLER.equals(requestMappingInfoHandlerMethodEntry
@@ -248,7 +248,7 @@ public List<RouterOperation> getRouterOperations(OpenAPI openAPI, Locale locale)
248248
dataRestRepository.setCollectionLike(property.isCollectionLike());
249249
dataRestRepository.setMap(property.isMap());
250250
dataRestRepository.setPropertyType(property.getActualType());
251-
findControllers(routerOperationList, handlerMethodMapFilteredMethodMap, resourceMetadata, dataRestRepository, openAPI, locale);
251+
findControllers(routerOperationList, handlerMethodMapFilteredMethodMap, resourceMetadata, dataRestRepository, openAPI);
252252
}
253253
});
254254
}
@@ -261,19 +261,19 @@ else if (handlerMapping instanceof BasePathAwareHandlerMapping) {
261261
.filter(controller -> !AbstractOpenApiResource.isHiddenRestControllers(controller.getValue().getBeanType()))
262262
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a1, a2) -> a1));
263263
dataRestRepository.setControllerType(ControllerType.SCHEMA);
264-
findControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI, locale);
264+
findControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI);
265265
handlerMethodMapFiltered = handlerMethodMap.entrySet().stream()
266266
.filter(requestMappingInfoHandlerMethodEntry -> ProfileController.class.equals(requestMappingInfoHandlerMethodEntry
267267
.getValue().getBeanType()) || AlpsController.class.equals(requestMappingInfoHandlerMethodEntry
268268
.getValue().getBeanType()))
269269
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a1, a2) -> a1));
270270
dataRestRepository.setControllerType(ControllerType.GENERAL);
271-
findControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI, locale);
271+
findControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI);
272272
}
273273
}
274274
}
275275
// search
276-
findSearchResourceMappings(openAPI, routerOperationList, handlerMappingList, dataRestRepository, resourceMetadata, locale);
276+
findSearchResourceMappings(openAPI, routerOperationList, handlerMappingList, dataRestRepository, resourceMetadata);
277277
}
278278
return routerOperationList;
279279
}
@@ -343,10 +343,9 @@ private List<HandlerMapping> getHandlerMappingList() {
343343
* @param handlerMappingList the handler mapping list
344344
* @param dataRestRepository the repository data rest
345345
* @param resourceMetadata the resource metadata
346-
* @param locale the locale
347346
*/
348347
private void findSearchResourceMappings(OpenAPI openAPI, List<RouterOperation> routerOperationList, List<HandlerMapping> handlerMappingList,
349-
DataRestRepository dataRestRepository, ResourceMetadata resourceMetadata, Locale locale) {
348+
DataRestRepository dataRestRepository, ResourceMetadata resourceMetadata) {
350349
for (HandlerMapping handlerMapping : handlerMappingList) {
351350
if (handlerMapping instanceof RepositoryRestHandlerMapping) {
352351
RepositoryRestHandlerMapping repositoryRestHandlerMapping = (RepositoryRestHandlerMapping) handlerMapping;
@@ -359,7 +358,7 @@ private void findSearchResourceMappings(OpenAPI openAPI, List<RouterOperation> r
359358
ResourceMetadata metadata = associations.getMetadataFor(dataRestRepository.getDomainType());
360359
SearchResourceMappings searchResourceMappings = metadata.getSearchResourceMappings();
361360
if (searchResourceMappings.isExported()) {
362-
findSearchControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI, searchResourceMappings, locale);
361+
findSearchControllers(routerOperationList, handlerMethodMapFiltered, resourceMetadata, dataRestRepository, openAPI, searchResourceMappings);
363362
}
364363
}
365364
}
@@ -374,15 +373,14 @@ private void findSearchResourceMappings(OpenAPI openAPI, List<RouterOperation> r
374373
* @param dataRestRepository the repository data rest
375374
* @param openAPI the open api
376375
* @param searchResourceMappings the search resource mappings
377-
* @param locale the locale
378376
* @return the list
379377
*/
380378
private List<RouterOperation> findSearchControllers(List<RouterOperation> routerOperationList,
381379
Map<RequestMappingInfo, HandlerMethod> handlerMethodMap, ResourceMetadata resourceMetadata, DataRestRepository dataRestRepository,
382-
OpenAPI openAPI, SearchResourceMappings searchResourceMappings, Locale locale) {
380+
OpenAPI openAPI, SearchResourceMappings searchResourceMappings) {
383381
Stream<MethodResourceMapping> methodResourceMappingStream = searchResourceMappings.getExportedMappings();
384382
methodResourceMappingStream.forEach(methodResourceMapping -> dataRestRouterOperationService.buildSearchRouterOperationList(
385-
routerOperationList, handlerMethodMap, resourceMetadata, dataRestRepository, openAPI, methodResourceMapping, locale));
383+
routerOperationList, handlerMethodMap, resourceMetadata, dataRestRepository, openAPI, methodResourceMapping));
386384
return routerOperationList;
387385
}
388386

@@ -395,14 +393,13 @@ private List<RouterOperation> findSearchControllers(List<RouterOperation> router
395393
* @param resourceMetadata the resource metadata
396394
* @param dataRestRepository the repository data rest
397395
* @param openAPI the open api
398-
* @param locale the locale
399396
* @return the list
400397
*/
401398
private List<RouterOperation> findControllers(List<RouterOperation> routerOperationList,
402399
Map<RequestMappingInfo, HandlerMethod> handlerMethodMap, ResourceMetadata resourceMetadata,
403-
DataRestRepository dataRestRepository, OpenAPI openAPI, Locale locale) {
400+
DataRestRepository dataRestRepository, OpenAPI openAPI) {
404401
dataRestRouterOperationService.buildEntityRouterOperationList(routerOperationList, handlerMethodMap, resourceMetadata,
405-
dataRestRepository, openAPI, locale);
402+
dataRestRepository, openAPI);
406403
return routerOperationList;
407404
}
408405

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/core/DataRestRepository.java

+28-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
package org.springdoc.data.rest.core;
2525

26+
import java.util.Locale;
27+
2628
import org.springframework.data.mapping.PersistentEntity;
2729

2830
/**
@@ -71,15 +73,22 @@ public class DataRestRepository {
7173
*/
7274
private PersistentEntity persistentEntity;
7375

76+
/**
77+
* The Locale.
78+
*/
79+
private Locale locale;
80+
7481
/**
7582
* Instantiates a new Data rest repository.
7683
*
7784
* @param domainType the domain type
7885
* @param repositoryType the repository type
86+
* @param locale the locale
7987
*/
80-
public DataRestRepository(Class<?> domainType, Class<?> repositoryType) {
88+
public DataRestRepository(Class<?> domainType, Class<?> repositoryType,Locale locale) {
8189
this.domainType = domainType;
8290
this.repositoryType = repositoryType;
91+
this.locale=locale;
8392
}
8493

8594
/**
@@ -228,6 +237,24 @@ public void setPersistentEntity(PersistentEntity persistentEntity) {
228237
this.persistentEntity = persistentEntity;
229238
}
230239

240+
/**
241+
* Gets locale.
242+
*
243+
* @return the locale
244+
*/
245+
public Locale getLocale() {
246+
return locale;
247+
}
248+
249+
/**
250+
* Sets locale.
251+
*
252+
* @param locale the locale
253+
*/
254+
public void setLocale(Locale locale) {
255+
this.locale = locale;
256+
}
257+
231258
/**
232259
* Gets return type.
233260
*

0 commit comments

Comments
 (0)