简体   繁体   English

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

[英]Unable to return rest api Response using ControllerAdvice in SpringBoot

Unable to Return Rest ApiResponse using Controller Advice. 无法使用Controller Advice返回Rest ApiResponse。

Solution implemented 解决方案已实施

** My Approach** **我的方法**

1)I created a Controller that throw an exception. 1)我创建了一个抛出异常的控制器。

2)Global Exception Handler will catch the exception using @ControllerAdvice. 2)全局异常处理程序将使用@ControllerAdvice捕获异常。

3)particular method will return response as APIResponse. 3)特定方法将响应作为APIResponse返回。

Output Shown 显示的输出

{
"timestamp": 1519377824339,
"status": 404,
"error": "Not Found",
"exception": "java.lang.Exception",
"message": "No message available",
"path": "/test"
}

And Output from Console says 控制台的输出说

System.out.println(" Request Received Here for Exception "); System.out.println(“在此处收到异常请求”);

Output Expected 预期产量

{
"success": false,
"message": "null Your Exception ",
"object": null
}  

Below is my Code 下面是我的代码

@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;
}
}

Request url 要求网址

localhost:6005/test 本地主机:6005 / test

User Body contains 用户主体包含

{
 "name":"jalaj"
}

Below is my pom.xml 下面是我的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>

I can only judge from the output that my controller is not executing. 我只能从输出中判断我的控制器没有执行。

You can download the code from my bitbucket profile to see my code. 您可以从我的bitbucket个人资料中下载代码,以查看我的代码。

https://bitbucket.org/JalajChawla/ https://bitbucket.org/JalajChawla/

Can anyone guide me if I am missing anything? 如果我想念什么,谁能指导我?

Just extend from GlobalExceptionHandlerController from TestController 只是从TestController GlobalExceptionHandlerController扩展

@RequestMapping("/test")
@RestController
public class TestController extends GlobalExceptionHandlerController 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM