controlleradvice没有被调用,但是我仍然可以在响应中看到异常需要集中处理异常

sqxo8psd  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(417)

因为我刚刚开始使用springboot,所以我正在创建一个非常基本的项目,其中包含非常基本的rest控制器。其目的是在尝试任何复杂的代码之前了解基础知识,因此下面的示例非常基础。没有复杂的业务逻辑,只有最少的代码行。
我用一个简单的rest控制器创建了一个基本项目,它有以下注解

@RestController
@RequestMapping("users")
public class UserController
    {

在get方法中,我故意创建了一个null指针异常,方法是将null赋给变量,然后检查长度。

@GetMapping(path="/{UserId}",produces = {MediaType.APPLICATION_JSON_VALUE})
        public ResponseEntity<UserViewDTO> getUser(@PathVariable String UserId)
            {

                String firstName = null;
                int len_fname = firstName.length();

                UserViewDTO responseBody= new UserViewDTO();
                responseBody.setFirstname("1stname");
                responseBody.setLastname("lastname");
                responseBody.setEmail("email@gmail.com");
                responseBody.setUserid(UserId);

                return  new ResponseEntity<UserViewDTO>(responseBody,HttpStatus.OK);

            }

因此,我收到了 Postman 回复的吼叫信息。

{
    "timestamp": "2021-03-07T19:56:48.790+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "exception": "java.lang.NullPointerException",
    "message": "No message available",
    "path": "/users/1212121"
}

我想用一个中心类的@controller建议来处理这个问题。我创建了以下

import org.apache.catalina.WebResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class AppExceptionHandler extends ResponseEntityExceptionHandler
    {

        @ExceptionHandler(value= {Exception.class})
        public ResponseEntity<Object> handleAnyException(Exception ex, WebRequest request)
            {
                return  new ResponseEntity<>(
                        ex, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);
            }

    }

当我放置一个调试器时,@controlleradvice下的代码甚至没有被激活。这里还有我的application.properties代码

server.error.include-exception=true
server.error.include-message=always
server.error.include-binding-errors=always

我做错什么了?

cunj1qz1

cunj1qz11#

我使用它而不延伸。您应该是remove extends responseentityexceptionhandler,或者您必须是override parent class handler method如果运行此代码,您可以在此处查看用法https://github.com/cebrailinanc/spring-cloud/tree/master/product-service/src/main/java/com/cbrl/cloud/product/api

@ControllerAdvice
public class AppExceptionHandler {
    @ExceptionHandler(value = {Exception.class})
    public ResponseEntity<Object> handleAnyException(Exception ex) {
       return new ResponseEntity(ex, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
mxg2im7a

mxg2im7a2#

说实话我看不出你有什么问题 @ControllerAdvice .
如果可能,请删除注解中的值,就像只有一个名为value的元素一样,然后可以省略名称,例如 @ExceptionHandler 它需要一系列的 Throwable 班级。如果可能,如果不需要,请移除 WebRequest 使用 @ResponseBody 以及 @ResponseStatus ```
@ResponseBody
@ResposneStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
return e.getMessage();
}

相关问题