Skip to content

https://github.com/springdoc/springdoc-openapi/issues/92 #93

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 24, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -42,17 +43,19 @@ public abstract class AbstractOpenApiResource {
protected OperationBuilder operationParser;
protected RequestBodyBuilder requestBodyBuilder;
protected GeneralInfoBuilder generalInfoBuilder;
protected Optional<List<OpenApiCustomiser>> openApiCustomisers;

protected AbstractOpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
RequestBodyBuilder requestBodyBuilder, GeneralInfoBuilder generalInfoBuilder) {
RequestBodyBuilder requestBodyBuilder, GeneralInfoBuilder generalInfoBuilder, Optional<List<OpenApiCustomiser>> openApiCustomisers) {
super();
this.openAPIBuilder = openAPIBuilder;
this.requestBuilder = requestBuilder;
this.responseBuilder = responseBuilder;
this.operationParser = operationParser;
this.requestBodyBuilder = requestBodyBuilder;
this.generalInfoBuilder = generalInfoBuilder;
this.openApiCustomisers = openApiCustomisers;
}

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

getPaths(restControllers);
OpenAPI openApi = openAPIBuilder.getOpenAPI();

// run the optional customisers
if (openApiCustomisers.isPresent()) {
openApiCustomisers.get().stream().forEach(openApiCustomiser -> openApiCustomiser.customise(openApi));
}

LOGGER.info("Init duration for springdoc-openapi is: {} ms", Duration.between(start, Instant.now()).toMillis());
return openAPIBuilder.getOpenAPI();
return openApi;
}

protected abstract void getPaths(Map<String, Object> findRestControllers);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.springdoc.api;

import io.swagger.v3.oas.models.OpenAPI;

public interface OpenApiCustomiser {
public void customise(OpenAPI openApi);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import static org.springframework.util.AntPathMatcher.*;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

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

public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser, GeneralInfoBuilder infoBuilder,
RequestBodyBuilder requestBodyBuilder, RequestMappingInfoHandlerMapping requestMappingHandlerMapping) {
super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestBodyBuilder, infoBuilder);
RequestBodyBuilder requestBodyBuilder, RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
Optional<List<OpenApiCustomiser>> openApiCustomisers) {
super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestBodyBuilder, infoBuilder, openApiCustomisers);
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package test.org.springdoc.api.app39;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.parameters.RequestBody;

@RestController
public class HelloController {

@Operation(summary = "test Request")
@RequestBody(description = "test value", required = true, content = @Content(schema = @Schema(implementation = String.class)))
@PostMapping("/test")
public void searchEmployee(String test) {
}

@GetMapping("/hello")
public String hello() {
return "hello";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package test.org.springdoc.api.app39;

import test.org.springdoc.api.AbstractSpringDocTest;

public class SpringDocApp39Test extends AbstractSpringDocTest {


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package test.org.springdoc.api.app39;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.HeaderParameter;
import org.springdoc.api.OpenApiCustomiser;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringDocTestApp {

public static void main(String[] args) {
SpringApplication.run(SpringDocTestApp.class, args);
}

@Bean
public OpenAPI customOpenAPI() {
StringSchema schema = new StringSchema();
return new OpenAPI()
.components(new Components().addParameters("myGlobalHeader", new HeaderParameter().required(true).name("My-Global-Header").description("My Global Header").schema(schema)));
}

@Bean
public OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {
return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream())
.forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/myGlobalHeader")));
}
}
79 changes: 79 additions & 0 deletions springdoc-openapi-core/src/test/resources/results/app39.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
{
"openapi": "3.0.1",
"info": {
"title": "OpenAPI definition",
"version": "v0"
},
"servers": [
{
"url": "http://localhost",
"description": "Generated server url"
}
],
"paths": {
"/test": {
"post": {
"summary": "test Request",
"operationId": "searchEmployee",
"parameters": [
{
"in": "header",
"$ref": "#/components/parameters/myGlobalHeader"
}
],
"requestBody": {
"description": "test value",
"content": {
"*/*": {
"schema": {
"type": "string"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "default response"
}
}
}
},
"/hello": {
"get": {
"operationId": "hello",
"parameters": [
{
"in": "header",
"$ref": "#/components/parameters/myGlobalHeader"
}
],
"responses": {
"200": {
"description": "default response",
"content": {
"*/*": {
"schema": {
"type": "string"
}
}
}
}
}
}
}
},
"components": {
"parameters": {
"myGlobalHeader": {
"name": "My-Global-Header",
"in": "header",
"description": "My Global Header",
"required": true,
"schema": {
"type": "string"
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import static org.springdoc.core.Constants.*;
import static org.springframework.util.AntPathMatcher.*;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

import org.springdoc.core.AbstractRequestBuilder;
Expand Down Expand Up @@ -42,9 +44,10 @@ public class OpenApiResource extends AbstractOpenApiResource {
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
GeneralInfoBuilder infoBuilder, RequestBodyBuilder requestBodyBuilder,
RequestMappingInfoHandlerMapping requestMappingHandlerMapping) {
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
Optional<List<OpenApiCustomiser>> openApiCustomisers) {
super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestBodyBuilder,
infoBuilder);
infoBuilder, openApiCustomisers);
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package test.org.springdoc.api.app39;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.parameters.RequestBody;

@RestController
public class HelloController {

@Operation(summary = "test Request")
@RequestBody(description = "test value", required = true, content = @Content(schema = @Schema(implementation = String.class)))
@PostMapping("/test")
public Mono<Void> searchEmployee(String test) {
return Mono.empty();
}

@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("hello");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package test.org.springdoc.api.app39;

import test.org.springdoc.api.AbstractSpringDocTest;

public class SpringDocApp39Test extends AbstractSpringDocTest {


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package test.org.springdoc.api.app39;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.HeaderParameter;
import org.springdoc.api.OpenApiCustomiser;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = { "org.springdoc", "test.org.springdoc.api.app39" })
public class SpringDocTestApp {

public static void main(String[] args) {
SpringApplication.run(SpringDocTestApp.class, args);
}

@Bean
public OpenAPI customOpenAPI() {
StringSchema schema = new StringSchema();
return new OpenAPI()
.components(new Components().addParameters("myGlobalHeader", new HeaderParameter().required(true).name("My-Global-Header").description("My Global Header").schema(schema)));
}

@Bean
public OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {
return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream())
.forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/myGlobalHeader")));
}
}
Loading