无法在 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 响应的主要内容,如果未能解决你的问题,请参考以下文章

开发框架

springboot 登录+增删改查+获取登录人的ip地址

无法在 Laravel 5 中为特定路线添加 CORS

Simple Injector 无法在 Web API 控制器中注入依赖项

PGPool 在 SpringBoot 应用程序中无法与 HikariCP 一起使用

无法在 SpringBoot 中使用 ControllerAdvice 返回 rest api 响应