无法在 SpringBoot 中使用 ControllerAdvice 返回 rest api 响应
Posted
技术标签:
【中文标题】无法在 SpringBoot 中使用 ControllerAdvice 返回 rest api 响应【英文标题】:Unable to return rest api Response using ControllerAdvice in SpringBoot 【发布时间】:2018-08-03 07:48:20 【问题描述】:无法使用控制器建议返回 Rest ApiResponse。
解决方案已实施
** 我的方法**
1)我创建了一个抛出异常的控制器。
2)全局异常处理程序将使用@ControllerAdvice 捕获异常。
3) 特定方法将返回响应为 APIResponse。
显示输出
"timestamp": 1519377824339,
"status": 404,
"error": "Not Found",
"exception": "java.lang.Exception",
"message": "No message available",
"path": "/test"
控制台的输出显示
System.out.println("此处收到异常请求");
预期输出
"success": false,
"message": "null Your Exception ",
"object": null
下面是我的代码
@RequestMapping("/test")
@RestController
public class TestController
@Autowired
private UserService userService;
@PostMapping
ApiResponse<User> post(@RequestBody User user) throws Exception
if(true)
throw new Exception();
return ApiResponse.success().object(userService.post(user));
@ControllerAdvice
public class GlobalExceptionHandlerController
@ExceptionHandler(value = Exception.class)
public ApiResponse<Void> handleDefaultException(Exception exception)
System.out.println(" Request Received Here for Exception ");
return ApiResponse.failure().message(exception.getMessage() + "Please check your Response").build();
public class ApiResponse<T>
private boolean success;
private String message;
private T object;
public static class ResponseBuilder
private boolean success;
private String message;
private ResponseBuilder(boolean success)
this.success = success;
this.message = "";
public ResponseBuilder message(String message)
this.message = message;
return this;
public <C> ApiResponse<C> object(C object)
return new ApiResponse<C>(success, message, object);
public <C> ApiResponse<C> build()
return new ApiResponse<>(success, message, null);
public static ResponseBuilder success()
return new ResponseBuilder(true);
public static ResponseBuilder failure()
return new ResponseBuilder(false);
private ApiResponse(boolean success, String message, T object)
this.success = success;
this.message = message;
this.object = object;
public boolean isSuccess()
return success;
public void setSuccess(boolean success)
this.success = success;
public String getMessage()
return message;
public void setMessage(String message)
this.message = message;
public T getObject()
return object;
public void setObject(T object)
this.object = object;
请求网址
本地主机:6005/测试
用户正文包含
"name":"jalaj"
下面是我的 pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
我只能从输出判断我的控制器没有执行。
您可以从我的 bitbucket 配置文件下载代码以查看我的代码。
https://bitbucket.org/JalajChawla/
如果我遗漏了什么,谁能指导我?
【问题讨论】:
【参考方案1】:只需从GlobalExceptionHandlerController
扩展自TestController
@RequestMapping("/test")
@RestController
public class TestController extends GlobalExceptionHandlerController
【讨论】:
我知道这种方法。但我不想在每个控制器中进行扩展。这就是我使用 ControllerAdvice 的原因以上是关于无法在 SpringBoot 中使用 ControllerAdvice 返回 rest api 响应的主要内容,如果未能解决你的问题,请参考以下文章
Simple Injector 无法在 Web API 控制器中注入依赖项