因为我刚刚开始使用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
我做错什么了?
2条答案
按热度按时间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
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();
}