Skip to content

Commit 660126e

Browse files
committed
Merge branch 'fix_oasv3_1' of github.com:uc4w6c/springdoc-openapi into uc4w6c-fix_oasv3_1
2 parents 80739c2 + d0021a2 commit 660126e

File tree

11 files changed

+197
-16
lines changed

11 files changed

+197
-16
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import org.springdoc.core.models.GroupedOpenApi;
7575
import org.springdoc.core.parsers.ReturnTypeParser;
7676
import org.springdoc.core.properties.SpringDocConfigProperties;
77+
import org.springdoc.core.properties.SpringDocConfigProperties.ApiDocs.OpenApiVersion;
7778
import org.springdoc.core.providers.ActuatorProvider;
7879
import org.springdoc.core.providers.CloudFunctionProvider;
7980
import org.springdoc.core.providers.JavadocProvider;
@@ -297,8 +298,9 @@ OpenAPIService openAPIBuilder(Optional<OpenAPI> openAPI,
297298
*/
298299
@Bean
299300
@Lazy(false)
300-
ModelConverterRegistrar modelConverterRegistrar(Optional<List<ModelConverter>> modelConverters) {
301-
return new ModelConverterRegistrar(modelConverters.orElse(Collections.emptyList()));
301+
ModelConverterRegistrar modelConverterRegistrar(Optional<List<ModelConverter>> modelConverters, SpringDocConfigProperties springDocConfigProperties) {
302+
boolean openapi31 = OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion();
303+
return new ModelConverterRegistrar(modelConverters.orElse(Collections.emptyList()), openapi31);
302304
}
303305

304306
/**
@@ -637,10 +639,11 @@ static class QuerydslProvider {
637639
@Bean
638640
@ConditionalOnMissingBean
639641
@Lazy(false)
640-
QuerydslPredicateOperationCustomizer queryDslQuerydslPredicateOperationCustomizer(Optional<QuerydslBindingsFactory> querydslBindingsFactory) {
642+
QuerydslPredicateOperationCustomizer queryDslQuerydslPredicateOperationCustomizer(Optional<QuerydslBindingsFactory> querydslBindingsFactory, SpringDocConfigProperties springDocConfigProperties) {
641643
if (querydslBindingsFactory.isPresent()) {
642644
getConfig().addRequestWrapperToIgnore(Predicate.class);
643-
return new QuerydslPredicateOperationCustomizer(querydslBindingsFactory.get());
645+
boolean openapi31 = OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion();
646+
return new QuerydslPredicateOperationCustomizer(querydslBindingsFactory.get(), openapi31);
644647
}
645648
return null;
646649
}

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocDataRestConfiguration.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.springdoc.core.data.DataRestTagsService;
3737
import org.springdoc.core.discoverer.SpringDocParameterNameDiscoverer;
3838
import org.springdoc.core.properties.SpringDocConfigProperties;
39+
import org.springdoc.core.properties.SpringDocConfigProperties.ApiDocs.OpenApiVersion;
3940
import org.springdoc.core.providers.DataRestHalProvider;
4041
import org.springdoc.core.providers.ObjectMapperProvider;
4142
import org.springdoc.core.providers.SpringRepositoryRestResourceProvider;
@@ -232,8 +233,9 @@ DataRestTagsService dataRestTagsBuilder(OpenAPIService openAPIService) {
232233
@Bean
233234
@ConditionalOnMissingBean
234235
@Lazy(false)
235-
SpringDocDataRestUtils springDocDataRestUtils(LinkRelationProvider linkRelationProvider, RepositoryRestConfiguration repositoryRestConfiguration) {
236-
return new SpringDocDataRestUtils(linkRelationProvider, repositoryRestConfiguration);
236+
SpringDocDataRestUtils springDocDataRestUtils(LinkRelationProvider linkRelationProvider, RepositoryRestConfiguration repositoryRestConfiguration, SpringDocConfigProperties springDocConfigProperties) {
237+
boolean openapi31 = OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion();
238+
return new SpringDocDataRestUtils(linkRelationProvider, repositoryRestConfiguration, openapi31);
237239
}
238240
}
239241

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/converters/ModelConverterRegistrar.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.apache.commons.lang3.reflect.FieldUtils;
3434
import org.slf4j.Logger;
3535
import org.slf4j.LoggerFactory;
36+
import org.springdoc.core.properties.SpringDocConfigProperties;
37+
import org.springdoc.core.utils.SpringDocAnnotationsUtils;
3638

3739
/**
3840
* Wrapper for model converters to only register converters once
@@ -43,7 +45,7 @@ public class ModelConverterRegistrar {
4345
/**
4446
* The constant modelConvertersInstance.
4547
*/
46-
private static final ModelConverters modelConvertersInstance = ModelConverters.getInstance();
48+
private static ModelConverters modelConvertersInstance = null;
4749

4850
/**
4951
* The constant LOGGER.
@@ -55,7 +57,9 @@ public class ModelConverterRegistrar {
5557
*
5658
* @param modelConverters spring registered model converter beans which have to be registered in {@link ModelConverters} instance
5759
*/
58-
public ModelConverterRegistrar(List<ModelConverter> modelConverters) {
60+
public ModelConverterRegistrar(List<ModelConverter> modelConverters, boolean openapi31) {
61+
modelConvertersInstance = ModelConverters.getInstance(openapi31);
62+
SpringDocAnnotationsUtils.setOpenapi31(openapi31);
5963
for (ModelConverter modelConverter : modelConverters) {
6064
Optional<ModelConverter> registeredConverterOptional = getRegisteredConverterSameAs(modelConverter);
6165
registeredConverterOptional.ifPresent(modelConvertersInstance::removeConverter);

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/customizers/OpenApiHateoasLinksCustomizer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.swagger.v3.oas.models.media.ObjectSchema;
3535
import io.swagger.v3.oas.models.media.StringSchema;
3636
import org.springdoc.core.properties.SpringDocConfigProperties;
37+
import org.springdoc.core.properties.SpringDocConfigProperties.ApiDocs.OpenApiVersion;
3738

3839
import org.springframework.hateoas.Link;
3940

@@ -59,7 +60,8 @@ public OpenApiHateoasLinksCustomizer(SpringDocConfigProperties springDocConfigPr
5960

6061
@Override
6162
public void customise(OpenAPI openApi) {
62-
ResolvedSchema resolvedLinkSchema = ModelConverters.getInstance()
63+
boolean openapi31 = OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion();
64+
ResolvedSchema resolvedLinkSchema = ModelConverters.getInstance(openapi31)
6365
.resolveAsResolvedSchema(new AnnotatedType(Link.class));
6466
openApi
6567
.schema("Link", resolvedLinkSchema.schema)

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/customizers/QuerydslPredicateOperationCustomizer.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,19 @@ public class QuerydslPredicateOperationCustomizer implements GlobalOperationCust
7676
*/
7777
private final QuerydslBindingsFactory querydslBindingsFactory;
7878

79+
/**
80+
* OpenAPI v3.1
81+
*/
82+
private final boolean openapi31;
83+
7984
/**
8085
* Instantiates a new Querydsl predicate operation customizer.
8186
*
8287
* @param querydslBindingsFactory the querydsl bindings factory
8388
*/
84-
public QuerydslPredicateOperationCustomizer(QuerydslBindingsFactory querydslBindingsFactory) {
89+
public QuerydslPredicateOperationCustomizer(QuerydslBindingsFactory querydslBindingsFactory, boolean openapi31) {
8590
this.querydslBindingsFactory = querydslBindingsFactory;
91+
this.openapi31 = openapi31;
8692
}
8793

8894
@Override
@@ -286,7 +292,7 @@ private Parameter buildParam(Type type, String name) {
286292
schema = primitiveType.createProperty();
287293
}
288294
else {
289-
ResolvedSchema resolvedSchema = ModelConverters.getInstance()
295+
ResolvedSchema resolvedSchema = ModelConverters.getInstance(this.openapi31)
290296
.resolveAsResolvedSchema(
291297
new io.swagger.v3.core.converter.AnnotatedType(type).resolveAsRef(true));
292298
// could not resolve the schema or this schema references other schema
@@ -303,4 +309,4 @@ private Parameter buildParam(Type type, String name) {
303309
}
304310
return parameter;
305311
}
306-
}
312+
}

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/utils/SpringDocAnnotationsUtils.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public class SpringDocAnnotationsUtils extends AnnotationsUtils {
8585
ANNOTATIONS_TO_IGNORE.add(RequestAttribute.class);
8686
}
8787

88+
private static boolean OPENAPI31 = false;
89+
8890
/**
8991
* Resolve schema from type schema.
9092
*
@@ -118,7 +120,7 @@ public static Schema extractSchema(Components components, Type returnType, JsonV
118120
Schema schemaN = null;
119121
ResolvedSchema resolvedSchema;
120122
try {
121-
resolvedSchema = ModelConverters.getInstance()
123+
resolvedSchema = ModelConverters.getInstance(OPENAPI31)
122124
.resolveAsResolvedSchema(
123125
new AnnotatedType(returnType).resolveAsRef(true).jsonViewAnnotation(jsonView).ctxAnnotations(annotations));
124126
}
@@ -283,6 +285,15 @@ public static void removeAnnotationsToIgnore(Class<?>... classes) {
283285
ANNOTATIONS_TO_IGNORE.removeAll(Arrays.asList(classes));
284286
}
285287

288+
/**
289+
* set openapi31
290+
*
291+
* @param openapi31
292+
*/
293+
public static void setOpenapi31(boolean openapi31) {
294+
OPENAPI31 = openapi31;
295+
}
296+
286297
/**
287298
* Add encoding to media type.
288299
*

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/utils/SpringDocDataRestUtils.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ public class SpringDocDataRestUtils {
8787
*/
8888
private final LinkRelationProvider linkRelationProvider;
8989

90+
/**
91+
* OpenAPI v3.1
92+
*/
93+
private final boolean openapi31;
94+
95+
9096
/**
9197
* The Entity ino map.
9298
*/
@@ -103,9 +109,10 @@ public class SpringDocDataRestUtils {
103109
* @param linkRelationProvider the link relation provider
104110
* @param repositoryRestConfiguration the repository rest configuration
105111
*/
106-
public SpringDocDataRestUtils(LinkRelationProvider linkRelationProvider, RepositoryRestConfiguration repositoryRestConfiguration) {
112+
public SpringDocDataRestUtils(LinkRelationProvider linkRelationProvider, RepositoryRestConfiguration repositoryRestConfiguration, boolean openapi31) {
107113
this.linkRelationProvider = linkRelationProvider;
108114
this.repositoryRestConfiguration = repositoryRestConfiguration;
115+
this.openapi31 = openapi31;
109116
}
110117

111118
/**
@@ -205,7 +212,7 @@ private void updateRequestBodySchema(String className, Schema schema, Components
205212
schema.set$ref(newKey);
206213
//create new schema
207214
Class schemaImplementation = entityInoMap.get(className).getDomainType();
208-
ResolvedSchema resolvedSchema = ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(schemaImplementation));
215+
ResolvedSchema resolvedSchema = ModelConverters.getInstance(openapi31).readAllAsResolvedSchema(new AnnotatedType().type(schemaImplementation));
209216
Map<String, Schema> schemaMap;
210217
if (resolvedSchema != null) {
211218
schemaMap = resolvedSchema.referencedSchemas;
@@ -302,7 +309,7 @@ else if (itemsSchema instanceof ComposedSchema) {
302309
private Schema createNewResponseSchema(String className, Components components) {
303310
Class schemaImplementation = entityInoMap.get(className).getDomainType();
304311
Schema schemaObject = new Schema();
305-
ResolvedSchema resolvedSchema = ModelConverters.getInstance().readAllAsResolvedSchema(new AnnotatedType().type(schemaImplementation));
312+
ResolvedSchema resolvedSchema = ModelConverters.getInstance(openapi31).readAllAsResolvedSchema(new AnnotatedType().type(schemaImplementation));
306313
Map<String, Schema> schemaMap;
307314
if (resolvedSchema != null) {
308315
schemaMap = resolvedSchema.referencedSchemas;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
*
3+
* *
4+
* * *
5+
* * * * Copyright 2019-2023 the original author or authors.
6+
* * * *
7+
* * * * Licensed under the Apache License, Version 2.0 (the "License");
8+
* * * * you may not use this file except in compliance with the License.
9+
* * * * You may obtain a copy of the License at
10+
* * * *
11+
* * * * https://www.apache.org/licenses/LICENSE-2.0
12+
* * * *
13+
* * * * Unless required by applicable law or agreed to in writing, software
14+
* * * * distributed under the License is distributed on an "AS IS" BASIS,
15+
* * * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* * * * See the License for the specific language governing permissions and
17+
* * * * limitations under the License.
18+
* * *
19+
* *
20+
*
21+
*/
22+
23+
package test.org.springdoc.api.v31.app7;
24+
25+
import org.springframework.web.bind.annotation.GetMapping;
26+
import org.springframework.web.bind.annotation.RequestBody;
27+
import org.springframework.web.bind.annotation.RestController;
28+
29+
@RestController
30+
public class ExamplesController {
31+
32+
@GetMapping(value = "/")
33+
public ExamplesResponse index() {
34+
return null;
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package test.org.springdoc.api.v31.app7;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
6+
7+
public record ExamplesResponse(
8+
@Schema(description = "name", requiredMode = REQUIRED, examples = { "name" })
9+
String name,
10+
@Schema(description = "subject", requiredMode = REQUIRED, example = "Hello", examples = { "Hello", "World" })
11+
String subject
12+
) {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
*
3+
* *
4+
* * *
5+
* * * * Copyright 2019-2023 the original author or authors.
6+
* * * *
7+
* * * * Licensed under the Apache License, Version 2.0 (the "License");
8+
* * * * you may not use this file except in compliance with the License.
9+
* * * * You may obtain a copy of the License at
10+
* * * *
11+
* * * * https://www.apache.org/licenses/LICENSE-2.0
12+
* * * *
13+
* * * * Unless required by applicable law or agreed to in writing, software
14+
* * * * distributed under the License is distributed on an "AS IS" BASIS,
15+
* * * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* * * * See the License for the specific language governing permissions and
17+
* * * * limitations under the License.
18+
* * *
19+
* *
20+
*
21+
*/
22+
23+
package test.org.springdoc.api.v31.app7;
24+
25+
import test.org.springdoc.api.v31.AbstractSpringDocV31Test;
26+
27+
import org.springframework.boot.autoconfigure.SpringBootApplication;
28+
29+
public class SpringDocApp7Test extends AbstractSpringDocV31Test {
30+
31+
@SpringBootApplication
32+
static class SpringDocTestApp {
33+
34+
}
35+
}

0 commit comments

Comments
 (0)