Skip to content

Commit 104c681

Browse files
author
bnasslahsen
committed
Support for setting default produces/consumes mediaTypes. Fixes #442
1 parent 837159c commit 104c681

File tree

8 files changed

+99
-67
lines changed

8 files changed

+99
-67
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ protected synchronized OpenAPI getOpenApi() {
140140
Duration.between(start, Instant.now()).toMillis());
141141
}
142142
else {
143-
if(!openAPIBuilder.isServersPresent())
143+
if (!openAPIBuilder.isServersPresent())
144144
openAPIBuilder.updateServers(openAPIBuilder.getCachedOpenAPI());
145145
openApi = openAPIBuilder.getCachedOpenAPI();
146146
}
@@ -173,7 +173,7 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
173173
RequestMapping reqMappingClass = ReflectionUtils.getAnnotation(handlerMethod.getBeanType(),
174174
RequestMapping.class);
175175

176-
MethodAttributes methodAttributes = new MethodAttributes();
176+
MethodAttributes methodAttributes = new MethodAttributes(springDocConfigProperties.getDefaultConsumesMediaType(), springDocConfigProperties.getDefaultProducesMediaType());
177177
methodAttributes.setMethodOverloaded(existingOperation != null);
178178

179179
if (reqMappingClass != null) {
@@ -346,10 +346,10 @@ protected boolean isPackageToScan(String aPackage) {
346346
if (optionalGroupConfig.isPresent())
347347
packagesToExclude = optionalGroupConfig.get().getPackagesToExclude();
348348
}
349-
boolean include = CollectionUtils.isEmpty(packagesToScan)
349+
boolean include = CollectionUtils.isEmpty(packagesToScan)
350350
|| packagesToScan.stream().anyMatch(pack -> aPackage.equals(pack)
351351
|| aPackage.startsWith(pack + "."));
352-
boolean exclude = !CollectionUtils.isEmpty(packagesToExclude)
352+
boolean exclude = !CollectionUtils.isEmpty(packagesToExclude)
353353
&& (packagesToExclude.stream().anyMatch(pack -> aPackage.equals(pack)
354354
|| aPackage.startsWith(pack + ".")));
355355

@@ -369,8 +369,8 @@ protected boolean isPathToMatch(String operationPath) {
369369
if (optionalGroupConfig.isPresent())
370370
pathsToExclude = optionalGroupConfig.get().getPathsToExclude();
371371
}
372-
boolean include = CollectionUtils.isEmpty(pathsToMatch) || pathsToMatch.stream().anyMatch(pattern -> antPathMatcher.match(pattern, operationPath));
373-
boolean exclude = !CollectionUtils.isEmpty(pathsToExclude) && pathsToExclude.stream().anyMatch(pattern -> antPathMatcher.match(pattern, operationPath));
372+
boolean include = CollectionUtils.isEmpty(pathsToMatch) || pathsToMatch.stream().anyMatch(pattern -> antPathMatcher.match(pattern, operationPath));
373+
boolean exclude = !CollectionUtils.isEmpty(pathsToExclude) && pathsToExclude.stream().anyMatch(pattern -> antPathMatcher.match(pattern, operationPath));
374374
return include && !exclude;
375375
}
376376

@@ -403,7 +403,7 @@ protected Set getDefaultAllowedHttpMethods() {
403403
return new HashSet<>(Arrays.asList(allowedRequestMethods));
404404
}
405405

406-
public static void addDeprecatedType(Class<?> cls){
406+
public static void addDeprecatedType(Class<?> cls) {
407407
DEPRECATED_TYPES.add(cls);
408408
}
409409

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646

4747
import org.springframework.core.annotation.AnnotatedElementUtils;
4848
import org.springframework.http.HttpStatus;
49-
import org.springframework.http.MediaType;
5049
import org.springframework.util.CollectionUtils;
5150
import org.springframework.web.bind.annotation.ExceptionHandler;
5251
import org.springframework.web.bind.annotation.RequestMapping;
@@ -65,10 +64,13 @@ public class GenericResponseBuilder {
6564

6665
private final List<ReturnTypeParser> returnTypeParsers;
6766

68-
protected GenericResponseBuilder(OperationBuilder operationBuilder, List<ReturnTypeParser> returnTypeParsers) {
67+
private final SpringDocConfigProperties springDocConfigProperties;
68+
69+
GenericResponseBuilder(OperationBuilder operationBuilder, List<ReturnTypeParser> returnTypeParsers, SpringDocConfigProperties springDocConfigProperties) {
6970
super();
7071
this.operationBuilder = operationBuilder;
7172
this.returnTypeParsers = returnTypeParsers;
73+
this.springDocConfigProperties=springDocConfigProperties;
7274
}
7375

7476
public ApiResponses build(Components components, HandlerMethod handlerMethod, Operation operation,
@@ -92,12 +94,12 @@ public void buildGenericResponse(Components components, Map<String, Object> find
9294
for (Method method : methods) {
9395
if (!operationBuilder.isHidden(method)) {
9496
RequestMapping reqMappringMethod = ReflectionUtils.getAnnotation(method, RequestMapping.class);
95-
String[] methodProduces = { MediaType.ALL_VALUE };
97+
String[] methodProduces = { springDocConfigProperties.getDefaultProducesMediaType() };
9698
if (reqMappringMethod != null) {
9799
methodProduces = reqMappringMethod.produces();
98100
}
99101
Map<String, ApiResponse> apiResponses = computeResponse(components, method, new ApiResponses(),
100-
new MethodAttributes(methodProduces), true);
102+
new MethodAttributes(methodProduces, springDocConfigProperties.getDefaultConsumesMediaType(), springDocConfigProperties.getDefaultProducesMediaType()), true);
101103
apiResponses.forEach(genericMapResponse::put);
102104
}
103105
}

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.apache.commons.lang3.ArrayUtils;
2525

2626
import org.springframework.core.annotation.AnnotatedElementUtils;
27-
import org.springframework.http.MediaType;
2827
import org.springframework.web.bind.annotation.DeleteMapping;
2928
import org.springframework.web.bind.annotation.GetMapping;
3029
import org.springframework.web.bind.annotation.PostMapping;
@@ -49,11 +48,19 @@ public class MethodAttributes {
4948

5049
private JsonView jsonViewAnnotationForRequestBody;
5150

52-
public MethodAttributes(String[] methodProducesNew) {
51+
private String defaultConsumesMediaType;
52+
53+
private String defaultProducesMediaType;
54+
55+
public MethodAttributes(String[] methodProducesNew, String defaultConsumesMediaType, String defaultProducesMediaType) {
5356
this.methodProduces = methodProducesNew;
57+
this.defaultConsumesMediaType = defaultConsumesMediaType;
58+
this.defaultProducesMediaType = defaultProducesMediaType;
5459
}
5560

56-
public MethodAttributes() {
61+
public MethodAttributes(String defaultConsumesMediaType, String defaultProducesMediaType) {
62+
this.defaultConsumesMediaType = defaultConsumesMediaType;
63+
this.defaultProducesMediaType = defaultProducesMediaType;
5764
}
5865

5966
public String[] getClassProduces() {
@@ -122,14 +129,14 @@ private void fillMethods(String[] produces, String[] consumes) {
122129
else if (ArrayUtils.isNotEmpty(classProduces))
123130
methodProduces = classProduces;
124131
else
125-
methodProduces = new String[] { MediaType.ALL_VALUE };
132+
methodProduces = new String[] { defaultProducesMediaType };
126133

127134
if (ArrayUtils.isNotEmpty(consumes))
128135
methodConsumes = consumes;
129136
else if (ArrayUtils.isNotEmpty(classConsumes))
130137
methodConsumes = classConsumes;
131138
else
132-
methodConsumes = new String[] { MediaType.APPLICATION_JSON_VALUE };
139+
methodConsumes = new String[] { defaultConsumesMediaType };
133140

134141
}
135142

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2525
import org.springframework.boot.context.properties.ConfigurationProperties;
2626
import org.springframework.context.annotation.Configuration;
27+
import org.springframework.http.MediaType;
2728

2829
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
2930

@@ -54,6 +55,10 @@ public class SpringDocConfigProperties {
5455

5556
private boolean modelAndViewAllowed;
5657

58+
private String defaultConsumesMediaType = MediaType.APPLICATION_JSON_VALUE;
59+
60+
private String defaultProducesMediaType = MediaType.ALL_VALUE;
61+
5762
public boolean isAutoTagClasses() {
5863
return autoTagClasses;
5964
}
@@ -282,4 +287,20 @@ public void setPathsToExclude(List<String> pathsToExclude) {
282287
this.pathsToExclude = pathsToExclude;
283288
}
284289
}
290+
291+
public String getDefaultConsumesMediaType() {
292+
return defaultConsumesMediaType;
293+
}
294+
295+
public void setDefaultConsumesMediaType(String defaultConsumesMediaType) {
296+
this.defaultConsumesMediaType = defaultConsumesMediaType;
297+
}
298+
299+
public String getDefaultProducesMediaType() {
300+
return defaultProducesMediaType;
301+
}
302+
303+
public void setDefaultProducesMediaType(String defaultProducesMediaType) {
304+
this.defaultProducesMediaType = defaultProducesMediaType;
305+
}
285306
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ public RequestBuilder requestBuilder(GenericParameterBuilder parameterBuilder, R
6363

6464
@Bean
6565
@ConditionalOnMissingBean
66-
public GenericResponseBuilder responseBuilder(OperationBuilder operationBuilder, List<ReturnTypeParser> returnTypeParsers) {
67-
return new GenericResponseBuilder(operationBuilder, returnTypeParsers);
66+
public GenericResponseBuilder responseBuilder(OperationBuilder operationBuilder, List<ReturnTypeParser> returnTypeParsers, SpringDocConfigProperties springDocConfigProperties) {
67+
return new GenericResponseBuilder(operationBuilder, returnTypeParsers, springDocConfigProperties);
6868
}
6969

7070
@Bean

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ public RequestBuilder requestBuilder(GenericParameterBuilder parameterBuilder, R
6969

7070
@Bean
7171
@ConditionalOnMissingBean
72-
public GenericResponseBuilder responseBuilder(OperationBuilder operationBuilder, List<ReturnTypeParser> returnTypeParsers) {
73-
return new GenericResponseBuilder(operationBuilder, returnTypeParsers);
72+
public GenericResponseBuilder responseBuilder(OperationBuilder operationBuilder, List<ReturnTypeParser> returnTypeParsers, SpringDocConfigProperties springDocConfigProperties) {
73+
return new GenericResponseBuilder(operationBuilder, returnTypeParsers, springDocConfigProperties);
7474
}
7575

7676
@Configuration

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app1/SpringDocApp1Test.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727

2828
import org.springframework.boot.autoconfigure.SpringBootApplication;
2929
import org.springframework.context.annotation.Bean;
30+
import org.springframework.test.context.TestPropertySource;
3031

32+
@TestPropertySource(properties = "springdoc.default-produces-media-type=application/json")
3133
public class SpringDocApp1Test extends AbstractSpringDocTest {
3234

3335
@SpringBootApplication

0 commit comments

Comments
 (0)