Spring Boot是目前最流行的Java Web开发框架之一,它提供了很多便捷的功能,包括处理异常。但是对于一些特殊的业务,我们需要自定义异常以及定制异常界面。接下来,我将详细介绍springboot中怎样实现自定义异常以及定制异常界面。
一、自定义异常
在Spring Boot中,我们可以通过继承Exception类或其子类来自定义异常。下面以订单异常为例说明如何自定义异常。
1. 定义异常类
创建一个OrderException类,继承自Exception类。
public class OrderException extends Exception {
public OrderException(String message) {
super(message);
}
}
2. 抛出异常
在OrderService类中,当订单出错时,可以用throw关键字抛出OrderException异常。
@Service
public class OrderService {
public void createOrder(Order order) throws OrderException {
if (order.getCustomerId() == null) {
throw new OrderException("订单创建失败,缺少customerId");
}
......
}
}
3. 处理异常
当OrderException被抛出时,为了使程序更加健壮,我们需要在Controller层对其进行处理。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(OrderException.class)
public ResponseEntity<String> handleOrderException(OrderException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
二、定制异常界面
在Spring Boot中,我们可以使用freemarker模板引擎来定制异常界面。下面以404界面为例说明如何定制异常界面。
1. 新建404页面
创建一个404.html页面,该页面可以放在templates目录下。
<!DOCTYPE html>
<html>
<head>
<title>404</title>
</head>
<body>
<h1>404</h1>
<p>您要访问的页面不存在</p>
</body>
</html>
2. 新建NotFoundPageController类
创建一个NotFoundPageController类,用来处理404异常。
@Controller
public class NotFoundPageController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if (statusCode == HttpStatus.NOT_FOUND.value()) {
return "404";
}
}
return "error";
}
@Override
public String getErrorPath() {
return "/error";
}
}
3. 配置WebMvcConfigurer
在WebMvcConfigurer中配置ErrorViewResolver,指定默认的ErrorView,这里设置为freemarker。
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private FreeMarkerViewResolver freeMarkerViewResolver;
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.viewResolver(freeMarkerViewResolver);
}
@Bean
public FreeMarkerViewResolver freeMarkerViewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setCache(false);
resolver.setPrefix("");
resolver.setSuffix(".html");
resolver.setContentType("text/html;charset=UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public ErrorViewResolver errorViewResolver() {
return new ErrorPageResolver();
}
private class ErrorPageResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
if (status == HttpStatus.NOT_FOUND) {
return new ModelAndView("404");
} else {
return new ModelAndView("error");
}
}
}
}
到此,我们完成了自定义异常以及定制异常界面的操作。
三、示例说明
现在,我们来看一下两条示例说明,更好的理解自定义异常以及定制异常界面的实现过程。
1. 示例一
访问地址”localhost:8080/order/create”时,如果订单创建失败,将会抛出OrderException异常,然后显示”订单创建失败,缺少customerId”的错误信息。
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/create")
public ResponseEntity<String> createOrder(@RequestBody Order order) {
try {
orderService.createOrder(order);
return new ResponseEntity<>("订单创建成功", HttpStatus.OK);
} catch (OrderException e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
}
2. 示例二
访问地址”localhost:8080/test”时,如果没有对应的Controller,将会抛出404异常,然后显示”您要访问的页面不存在”的错误信息。
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping
public ResponseEntity<String> test() {
return new ResponseEntity<>("test", HttpStatus.OK);
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot中自定义异常以及定制异常界面实现过程解析 - Python技术站