Skip to content

Commit

Permalink
Merge branch 'fix_exceptionhandler_response_status' of https://github…
Browse files Browse the repository at this point in the history
….com/uc4w6c/springdoc-openapi into uc4w6c-fix_exceptionhandler_response_status
  • Loading branch information
bnasslahsen committed Nov 14, 2022
2 parents cb7b0a3 + 562d4eb commit 30c520f
Show file tree
Hide file tree
Showing 6 changed files with 206 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ public class GenericResponseService {
*/
private final PropertyResolverUtils propertyResolverUtils;

/**
* The Controller infos.
*/
private final List<ControllerAdviceInfo> controllerInfos = new ArrayList<>();

/**
* The Controller advice infos.
*/
Expand Down Expand Up @@ -234,7 +239,12 @@ public void buildGenericResponse(Components components, Map<String, Object> find
}
}
synchronized (this) {
controllerAdviceInfos.add(controllerAdviceInfo);
if (AnnotatedElementUtils.hasAnnotation(objClz, ControllerAdvice.class)) {
controllerAdviceInfos.add(controllerAdviceInfo);
}
else {
controllerInfos.add(controllerAdviceInfo);
}
}
}
}
Expand Down Expand Up @@ -636,25 +646,22 @@ else if (returnType instanceof ParameterizedType) {
* @return the generic map response
*/
private synchronized Map<String, ApiResponse> getGenericMapResponse(Class<?> beanType) {
List<ControllerAdviceInfo> controllerAdviceInfosInThisBean = controllerAdviceInfos.stream()
.filter(controllerAdviceInfo ->
new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
.filter(controllerAdviceInfo -> beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
List<ControllerAdviceInfo> controllerAdviceInfosInThisBean = controllerInfos.stream()
.filter(controllerInfo -> beanType.equals(controllerInfo.getControllerAdvice().getClass()))
.collect(Collectors.toList());

Map<String, ApiResponse> genericApiResponseMap = controllerAdviceInfosInThisBean.stream()
.map(ControllerAdviceInfo::getApiResponseMap)
.map(ControllerAdviceInfo::getApiResponseMap)
.collect(LinkedHashMap::new, Map::putAll, Map::putAll);

List<ControllerAdviceInfo> controllerAdviceInfosNotInThisBean = controllerAdviceInfos.stream()
.filter(controllerAdviceInfo ->
new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
.filter(controllerAdviceInfo -> !beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
.collect(Collectors.toList());

for (ControllerAdviceInfo controllerAdviceInfo : controllerAdviceInfosNotInThisBean) {
controllerAdviceInfo.getApiResponseMap().forEach((key, apiResponse) -> {
if(!genericApiResponseMap.containsKey(key))
if (!genericApiResponseMap.containsKey(key))
genericApiResponseMap.put(key, apiResponse);
});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package test.org.springdoc.api.v30.app197;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/example2")
public class Example2Controller {
@GetMapping("/")
public void index() {
throw new IllegalArgumentException();
}

@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String customControllerException() {
return "example";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package test.org.springdoc.api.v30.app197;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/example")
public class ExampleController {
@GetMapping("/")
public void index() {
throw new IllegalArgumentException();
}

@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String customControllerException() {
return "example";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package test.org.springdoc.api.v30.app197;

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class MyExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler({ HttpRequestMethodNotSupportedException.class })
@ResponseBody
public Map<String, Object> handleError() {
Map<String, Object> errorMap = new HashMap<String, Object>();
errorMap.put("message", "error");
return errorMap;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
*
* *
* * *
* * * * Copyright 2019-2022 the original author or authors.
* * * *
* * * * Licensed under the Apache License, Version 2.0 (the "License");
* * * * you may not use this file except in compliance with the License.
* * * * You may obtain a copy of the License at
* * * *
* * * * https://www.apache.org/licenses/LICENSE-2.0
* * * *
* * * * Unless required by applicable law or agreed to in writing, software
* * * * distributed under the License is distributed on an "AS IS" BASIS,
* * * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * * * See the License for the specific language governing permissions and
* * * * limitations under the License.
* * *
* *
*
*/

package test.org.springdoc.api.v30.app197;

import test.org.springdoc.api.v30.AbstractSpringDocV30Test;

import org.springframework.boot.autoconfigure.SpringBootApplication;

public class SpringDocApp197Test extends AbstractSpringDocV30Test {

@SpringBootApplication
static class SpringDocTestApp {}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
{
"openapi": "3.0.1",
"info": {
"title": "OpenAPI definition",
"version": "v0"
},
"servers": [
{
"url": "http://localhost",
"description": "Generated server url"
}
],
"paths": {
"/example2/": {
"get": {
"tags": [
"example-2-controller"
],
"operationId": "index",
"responses": {
"200": {
"description": "OK"
},
"400": {
"description": "Bad Request",
"content": {
"*/*": {
"schema": {
"type": "string"
}
}
}
},
"500": {
"description": "Internal Server Error",
"content": {
"*/*": {
"schema": {
"type": "object",
"additionalProperties": {
"type": "object"
}
}
}
}
}
}
}
},
"/example/": {
"get": {
"tags": [
"example-controller"
],
"operationId": "index_1",
"responses": {
"200": {
"description": "OK"
},
"404": {
"description": "Not Found",
"content": {
"*/*": {
"schema": {
"type": "string"
}
}
}
},
"500": {
"description": "Internal Server Error",
"content": {
"*/*": {
"schema": {
"type": "object",
"additionalProperties": {
"type": "object"
}
}
}
}
}
}
}
}
},
"components": {}
}

0 comments on commit 30c520f

Please sign in to comment.