Skip to content

Commit 490b987

Browse files
author
springdoc
authored
Merge pull request #93 from davidmelia/OpenAPICustomiser
#92
2 parents 2502544 + a9aa2d5 commit 490b987

File tree

12 files changed

+320
-6
lines changed

12 files changed

+320
-6
lines changed

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

+12-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.time.Instant;
55
import java.util.List;
66
import java.util.Map;
7+
import java.util.Optional;
78
import java.util.Set;
89
import java.util.stream.Collectors;
910
import java.util.stream.Stream;
@@ -42,17 +43,19 @@ public abstract class AbstractOpenApiResource {
4243
protected OperationBuilder operationParser;
4344
protected RequestBodyBuilder requestBodyBuilder;
4445
protected GeneralInfoBuilder generalInfoBuilder;
46+
protected Optional<List<OpenApiCustomiser>> openApiCustomisers;
4547

4648
protected AbstractOpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
4749
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
48-
RequestBodyBuilder requestBodyBuilder, GeneralInfoBuilder generalInfoBuilder) {
50+
RequestBodyBuilder requestBodyBuilder, GeneralInfoBuilder generalInfoBuilder, Optional<List<OpenApiCustomiser>> openApiCustomisers) {
4951
super();
5052
this.openAPIBuilder = openAPIBuilder;
5153
this.requestBuilder = requestBuilder;
5254
this.responseBuilder = responseBuilder;
5355
this.operationParser = operationParser;
5456
this.requestBodyBuilder = requestBodyBuilder;
5557
this.generalInfoBuilder = generalInfoBuilder;
58+
this.openApiCustomisers = openApiCustomisers;
5659
}
5760

5861
protected OpenAPI getOpenApi() {
@@ -71,8 +74,15 @@ protected OpenAPI getOpenApi() {
7174
responseBuilder.buildGenericResponse(openAPIBuilder.getComponents(), findControllerAdvice);
7275

7376
getPaths(restControllers);
77+
OpenAPI openApi = openAPIBuilder.getOpenAPI();
78+
79+
// run the optional customisers
80+
if (openApiCustomisers.isPresent()) {
81+
openApiCustomisers.get().stream().forEach(openApiCustomiser -> openApiCustomiser.customise(openApi));
82+
}
83+
7484
LOGGER.info("Init duration for springdoc-openapi is: {} ms", Duration.between(start, Instant.now()).toMillis());
75-
return openAPIBuilder.getOpenAPI();
85+
return openApi;
7686
}
7787

7888
protected abstract void getPaths(Map<String, Object> findRestControllers);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.springdoc.api;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
5+
public interface OpenApiCustomiser {
6+
public void customise(OpenAPI openApi);
7+
}

springdoc-openapi-core/src/main/java/org/springdoc/api/OpenApiResource.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import static org.springframework.util.AntPathMatcher.*;
55

66
import java.util.HashSet;
7+
import java.util.List;
78
import java.util.Map;
9+
import java.util.Optional;
810
import java.util.Set;
911

1012
import javax.servlet.http.HttpServletRequest;
@@ -48,8 +50,9 @@ public class OpenApiResource extends AbstractOpenApiResource {
4850

4951
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
5052
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser, GeneralInfoBuilder infoBuilder,
51-
RequestBodyBuilder requestBodyBuilder, RequestMappingInfoHandlerMapping requestMappingHandlerMapping) {
52-
super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestBodyBuilder, infoBuilder);
53+
RequestBodyBuilder requestBodyBuilder, RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
54+
Optional<List<OpenApiCustomiser>> openApiCustomisers) {
55+
super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestBodyBuilder, infoBuilder, openApiCustomisers);
5356
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
5457
}
5558

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package test.org.springdoc.api.app39;
2+
3+
import org.springframework.web.bind.annotation.GetMapping;
4+
import org.springframework.web.bind.annotation.PostMapping;
5+
import org.springframework.web.bind.annotation.RestController;
6+
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import io.swagger.v3.oas.annotations.media.Content;
9+
import io.swagger.v3.oas.annotations.media.Schema;
10+
import io.swagger.v3.oas.annotations.parameters.RequestBody;
11+
12+
@RestController
13+
public class HelloController {
14+
15+
@Operation(summary = "test Request")
16+
@RequestBody(description = "test value", required = true, content = @Content(schema = @Schema(implementation = String.class)))
17+
@PostMapping("/test")
18+
public void searchEmployee(String test) {
19+
}
20+
21+
@GetMapping("/hello")
22+
public String hello() {
23+
return "hello";
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package test.org.springdoc.api.app39;
2+
3+
import test.org.springdoc.api.AbstractSpringDocTest;
4+
5+
public class SpringDocApp39Test extends AbstractSpringDocTest {
6+
7+
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package test.org.springdoc.api.app39;
2+
3+
import io.swagger.v3.oas.models.Components;
4+
import io.swagger.v3.oas.models.OpenAPI;
5+
import io.swagger.v3.oas.models.media.Schema;
6+
import io.swagger.v3.oas.models.media.StringSchema;
7+
import io.swagger.v3.oas.models.parameters.HeaderParameter;
8+
import org.springdoc.api.OpenApiCustomiser;
9+
import org.springframework.boot.SpringApplication;
10+
import org.springframework.boot.autoconfigure.SpringBootApplication;
11+
import org.springframework.context.annotation.Bean;
12+
13+
@SpringBootApplication
14+
public class SpringDocTestApp {
15+
16+
public static void main(String[] args) {
17+
SpringApplication.run(SpringDocTestApp.class, args);
18+
}
19+
20+
@Bean
21+
public OpenAPI customOpenAPI() {
22+
StringSchema schema = new StringSchema();
23+
return new OpenAPI()
24+
.components(new Components().addParameters("myGlobalHeader", new HeaderParameter().required(true).name("My-Global-Header").description("My Global Header").schema(schema)));
25+
}
26+
27+
@Bean
28+
public OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {
29+
return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream())
30+
.forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/myGlobalHeader")));
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "OpenAPI definition",
5+
"version": "v0"
6+
},
7+
"servers": [
8+
{
9+
"url": "http://localhost",
10+
"description": "Generated server url"
11+
}
12+
],
13+
"paths": {
14+
"/test": {
15+
"post": {
16+
"summary": "test Request",
17+
"operationId": "searchEmployee",
18+
"parameters": [
19+
{
20+
"in": "header",
21+
"$ref": "#/components/parameters/myGlobalHeader"
22+
}
23+
],
24+
"requestBody": {
25+
"description": "test value",
26+
"content": {
27+
"*/*": {
28+
"schema": {
29+
"type": "string"
30+
}
31+
}
32+
},
33+
"required": true
34+
},
35+
"responses": {
36+
"200": {
37+
"description": "default response"
38+
}
39+
}
40+
}
41+
},
42+
"/hello": {
43+
"get": {
44+
"operationId": "hello",
45+
"parameters": [
46+
{
47+
"in": "header",
48+
"$ref": "#/components/parameters/myGlobalHeader"
49+
}
50+
],
51+
"responses": {
52+
"200": {
53+
"description": "default response",
54+
"content": {
55+
"*/*": {
56+
"schema": {
57+
"type": "string"
58+
}
59+
}
60+
}
61+
}
62+
}
63+
}
64+
}
65+
},
66+
"components": {
67+
"parameters": {
68+
"myGlobalHeader": {
69+
"name": "My-Global-Header",
70+
"in": "header",
71+
"description": "My Global Header",
72+
"required": true,
73+
"schema": {
74+
"type": "string"
75+
}
76+
}
77+
}
78+
}
79+
}

springdoc-openapi-webflux-core/src/main/java/org/springdoc/api/OpenApiResource.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import static org.springdoc.core.Constants.*;
44
import static org.springframework.util.AntPathMatcher.*;
55

6+
import java.util.List;
67
import java.util.Map;
8+
import java.util.Optional;
79
import java.util.Set;
810

911
import org.springdoc.core.AbstractRequestBuilder;
@@ -42,9 +44,10 @@ public class OpenApiResource extends AbstractOpenApiResource {
4244
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
4345
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
4446
GeneralInfoBuilder infoBuilder, RequestBodyBuilder requestBodyBuilder,
45-
RequestMappingInfoHandlerMapping requestMappingHandlerMapping) {
47+
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
48+
Optional<List<OpenApiCustomiser>> openApiCustomisers) {
4649
super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestBodyBuilder,
47-
infoBuilder);
50+
infoBuilder, openApiCustomisers);
4851
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
4952
}
5053

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package test.org.springdoc.api.app39;
2+
3+
import org.springframework.web.bind.annotation.GetMapping;
4+
import org.springframework.web.bind.annotation.PostMapping;
5+
import org.springframework.web.bind.annotation.RestController;
6+
import reactor.core.publisher.Mono;
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import io.swagger.v3.oas.annotations.media.Content;
9+
import io.swagger.v3.oas.annotations.media.Schema;
10+
import io.swagger.v3.oas.annotations.parameters.RequestBody;
11+
12+
@RestController
13+
public class HelloController {
14+
15+
@Operation(summary = "test Request")
16+
@RequestBody(description = "test value", required = true, content = @Content(schema = @Schema(implementation = String.class)))
17+
@PostMapping("/test")
18+
public Mono<Void> searchEmployee(String test) {
19+
return Mono.empty();
20+
}
21+
22+
@GetMapping("/hello")
23+
public Mono<String> hello() {
24+
return Mono.just("hello");
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package test.org.springdoc.api.app39;
2+
3+
import test.org.springdoc.api.AbstractSpringDocTest;
4+
5+
public class SpringDocApp39Test extends AbstractSpringDocTest {
6+
7+
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package test.org.springdoc.api.app39;
2+
3+
import io.swagger.v3.oas.models.Components;
4+
import io.swagger.v3.oas.models.OpenAPI;
5+
import io.swagger.v3.oas.models.media.Schema;
6+
import io.swagger.v3.oas.models.media.StringSchema;
7+
import io.swagger.v3.oas.models.parameters.HeaderParameter;
8+
import org.springdoc.api.OpenApiCustomiser;
9+
import org.springframework.boot.SpringApplication;
10+
import org.springframework.boot.autoconfigure.SpringBootApplication;
11+
import org.springframework.context.annotation.Bean;
12+
import org.springframework.context.annotation.ComponentScan;
13+
14+
@SpringBootApplication
15+
@ComponentScan(basePackages = { "org.springdoc", "test.org.springdoc.api.app39" })
16+
public class SpringDocTestApp {
17+
18+
public static void main(String[] args) {
19+
SpringApplication.run(SpringDocTestApp.class, args);
20+
}
21+
22+
@Bean
23+
public OpenAPI customOpenAPI() {
24+
StringSchema schema = new StringSchema();
25+
return new OpenAPI()
26+
.components(new Components().addParameters("myGlobalHeader", new HeaderParameter().required(true).name("My-Global-Header").description("My Global Header").schema(schema)));
27+
}
28+
29+
@Bean
30+
public OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {
31+
return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream())
32+
.forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/myGlobalHeader")));
33+
}
34+
}

0 commit comments

Comments
 (0)