springboot中自定义异常以及定制异常界面实现过程解析

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技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 精致小巧的java相册制作方法

    精致小巧的Java相册制作方法 在本教程中,我们将学习如何使用Java语言制作一个简单的相册。相册将具有以下特点: 界面简洁,易用性高 可以显示图片,并允许用户使用翻页按钮浏览图片 用户可以通过控制按钮放大或缩小图片 1. 准备工作 在开始之前,请确保你已经安装好了以下软件和工具: JDK 1.8或以上版本 Eclipse或其他合适的Java IDE Swi…

    Java 2023年6月15日
    00
  • 浅谈Java8新特性Predicate接口

    浅谈Java8新特性Predicate接口 Java 8中新增加了Predicate接口,它定义了一个输入参数和返回值都为Boolean的函数。这个接口定义了许多实用的方法,可以被用来组合复杂的布尔逻辑。 Predicate接口定义 Predicate接口有一个test方法,返回一个Boolean类型,其定义如下: @FunctionalInterface …

    Java 2023年5月26日
    00
  • Java使用ObjectMapper的简单示例

    首先,我们需要了解一下ObjectMapper这个类,它是Jackson库中最常用的类之一,它允许Java对象与JSON对象之间的序列化和反序列化。该类提供了一系列方法,可以将Java对象转换为JSON格式,也可以将JSON格式的数据转换为Java对象。 安装Jackson依赖 如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: <de…

    Java 2023年5月26日
    00
  • IntelliJ IDEA 创建 Java 项目及创建 Java 文件并运行的详细步骤

    下面是关于“IntelliJ IDEA 创建 Java 项目及创建 Java 文件并运行的详细步骤”的完整攻略: 步骤一:创建新的Java项目 打开 IntelliJ IDEA,进入欢迎界面,点击 “Create New Project”。 确认左侧栏选择 “Java”,并输入项目的名称,可以任意取。然后点击 “Next”。 在弹出的窗口中选择 “Proje…

    Java 2023年5月20日
    00
  • java的arraylist排序示例(arraylist用法)

    下面是关于Java的ArrayList排序示例及用法的攻略。 ArrayList是什么 ArrayList是Java提供的集合框架中的一种,它继承了List接口并实现了可变数组。它的特点是可以添加、删除、排序和搜索其中的元素,同时可以动态地更改其大小。因其灵活性和高效性,它被广泛应用于Java程序开发中。 ArrayList的排序 使用自然排序(默认) Ar…

    Java 2023年5月26日
    00
  • MyBatis批量添加、修改和删除

    关于MyBatis批量添加、修改和删除的完整攻略,我会从以下几点进行详细讲解: 批量添加 INSERT INTO 批量修改 UPDATE 批量删除 DELETE 针对每个点,我会详细介绍其语法,以及两个示例。 1.批量添加 INSERT INTO 语法: <insert id="batchInsert" parameterType=…

    Java 2023年5月20日
    00
  • java根据扩展名获取系统图标和文件图标示例

    1. 获取系统图标和文件图标的背景知识 在讲解获取系统图标和文件图标的方法之前,我们需要了解一些背景知识。 当我们在操作系统中打开一个文件夹或文件时,会显示相应的图标。这些图标保存在操作系统的系统图标库中,即以 .dll 文件形式存在的文件,比如 Windows 中的 shell32.dll 文件。 Java 提供了获取系统图标和文件图标的方法,它们都是通过…

    Java 2023年5月19日
    00
  • 解析spring-security权限控制和校验的问题

    下面是对于解析Spring Security权限控制和校验的完整攻略。 1. 简介 Spring Security是一个为基于Spring的应用程序提供身份验证和授权的框架,Spring Security可帮助我们解决以下问题: 用户身份验证 用户授权(角色、权限) 攻击防范(例如Session Fixation防御和Clickjacking防御) 权限控制…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部