详解SpringBoot处理异常的几种常见姿势
在SpringBoot开发中,异常处理是一个非常重要的环节。合理的异常处理能够提高系统的稳定性和可维护性。本文将介绍几种常见的SpringBoot处理异常的姿势。
1. @ControllerAdvice和@ExceptionHandler
@ControllerAdvice是Spring4.0引入的一个注解,它可以用来处理全局的Controller的异常。@ExceptionHandler则是@ControllerAdvice下的注解,用来处理特定异常类型的异常。
代码示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ArithmeticException.class)
public ModelAndView handleArithmeticException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("exception", ex);
mv.setViewName("error/arithmetic");
return mv;
}
@ExceptionHandler(NullPointerException.class)
public ModelAndView handleNullPointerException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("exception", ex);
mv.setViewName("error/null_pointer");
return mv;
}
}
在上面的代码中,我们在一个类上加上@ControllerAdvice注解,表示这个类是一个全局异常处理类。然后我们在类中使用@ExceptionHandler注解来处理特定类型的异常。例如,handleArithmeticException方法处理ArithmeticException类型的异常,handleNullPointerException方法处理NullPointerException类型的异常。这两个方法都返回了一个包含异常信息的ModelAndView视图对象。
2. @ResponseStatus
@ResponseStatus注解用来指定处理某种异常时返回的HTTP状态码和异常信息。
代码示例:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
User user = userRepository.findById(id).orElse(null);
if (user == null) {
throw new UserNotFoundException("User not found");
}
return user;
}
}
@ResponseStatus(HttpStatus.NOT_FOUND)
class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
在上面的代码中,我们在UserNotFoundException类上使用了@ResponseStatus注解,并指定了HTTP状态码为404。这样,当我们在controller中抛出UserNotFoundException类型的异常时,框架会自动返回一个包含异常信息和404状态码的响应结果。
3. ResponseEntity
ResponseEntity是SpringFramework中的一个响应实体类,它可以用来封装响应的HTTP头、HTTP状态码和响应体等信息。
代码示例:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<?> getUserById(@PathVariable Long id) {
User user = userRepository.findById(id).orElse(null);
if (user == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse("User not found"));
}
return ResponseEntity.ok(user);
}
}
class ErrorResponse {
private String message;
public ErrorResponse(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
在上面的代码中,我们在getUserById方法中使用了ResponseEntity来封装响应结果。当用户不存在时,我们使用ResponseEntity.status(HttpStatus.NOT_FOUND)来设置响应的HTTP状态码;然后再使用.body()设置响应的实体体,即一个包含异常信息的ErrorResponse对象;否则,我们使用ResponseEntity.ok()来设置响应的HTTP状态码为200,同时设置响应体为一个User对象。
小结
在开发SpringBoot应用程序时,异常处理是一个非常重要的环节。合理的异常处理能够提高系统的稳定性和可维护性。在本文中,我们介绍了几种常见的SpringBoot处理异常的姿势,包括@ControllerAdvice和@ExceptionHandler、@ResponseStatus和ResponseEntity。开发者可以根据实际需求选择不同的姿势来处理异常。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解SpringBoot 处理异常的几种常见姿势 - Python技术站