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日

相关文章

  • MyBatis与SpringMVC相结合实现文件上传、下载功能

    下面是关于“MyBatis与SpringMVC相结合实现文件上传、下载功能”的完整攻略,包含两个示例说明。 MyBatis与SpringMVC相结合实现文件上传、下载功能 在Web应用程序中,文件上传和下载是常见的功能。本文将介绍如何使用MyBatis和SpringMVC相结合实现文件上传和下载功能。 文件上传 1. 添加依赖 首先,我们需要添加以下依赖: …

    Java 2023年5月17日
    00
  • 28基于java的简单酒店数据管理

    本文章介绍一个基于java的简单酒店数据管理系统 项目介绍 该项目适用于初学java后,需要一个小练手的java web项目,该项目是只有一个酒店数据表,然后实现对该酒店增加,修改,删除和分页查询的小案例,虽然项目不是很复杂,但麻雀虽小但五脏俱全,适合于个人学习适用。 项目使用的技术架构 后端:java+SpringBoot + MyBatis-Plus数据…

    Java 2023年5月6日
    00
  • 关于SpringBoot3.x中spring.factories功能被移除的解决方案

    关于SpringBoot3.x中spring.factories功能被移除的解决方案 在SpringBoot 3.x版本中,spring.factories功能被移除了。这个功能在之前的版本中被广泛使用,用于自动配置和扩展SpringBoot应用程序。本文将介绍spring.factories的作用、为什么被移除以及如何解决这个问题。 1. spring.f…

    Java 2023年5月15日
    00
  • MyBatis入门实例教程之创建一个简单的程序

    首先我们需要明确一下MyBatis的基础知识。MyBatis是一个持久层框架,可以与关系型数据库进行交互。在使用MyBatis时,我们需要进行以下三步操作: 配置数据源:需要在MyBatis的配置文件中配置数据库的连接信息。 编写Mapper文件:Mapper文件是MyBatis的核心,用于描述SQL语句以及与Java对象之间的映射关系。 执行SQL语句:通…

    Java 2023年5月20日
    00
  • java实现联机五子棋

    Java实现联机五子棋完整攻略 引言 联机五子棋是一种经典的、非常受欢迎的棋类游戏。在实现联机五子棋游戏过程中,需要采用 Java编程语言 进行设计和开发。本文将为您提供一份完整的攻略,指导您如何使用 Java实现联机五子棋游戏。 前置技能 在开始实现联机五子棋游戏前,我们需要掌握以下技能: 掌握 Java编程语言 ; 对 Java I/O相关API的使用必…

    Java 2023年5月19日
    00
  • Java算法设计与分析分治算法

    Java算法设计与分析之分治算法 什么是分治算法 分治算法是一种用于解决问题的基本算法思想。其核心思想是将待解决的问题划分成若干个规模较小但结构与原问题相似的子问题,递归地求解这些子问题,然后将这些子问题的解组合成原问题的解。 分治算法一般由三个步骤组成: 分解:将要解决的问题划分成若干规模较小的子问题。 解决:递归地求解子问题。 合并:将子问题的解合并成原…

    Java 2023年5月19日
    00
  • java OpenTelemetry日志体系及缺陷解决方案

    Java OpenTelemetry日志体系及缺陷解决方案 什么是OpenTelemetry OpenTelemetry(简称OTel)是一个开放的,可观测性的框架,用于生成、收集,处理和打包跨系统的有关分布式实例的数据。可以帮助开发人员解决微服务监测以及调试等问题。 OpenTelemetry日志体系 OpenTelemetry通过日志(Log)的方式,允…

    Java 2023年5月25日
    00
  • JAVA内部类示例详解及练习

    下面我就来详细讲解一下“JAVA内部类示例详解及练习”的完整攻略。 什么是Java内部类 Java内部类(Inner Class)指的是定义在另一个类中的类。Java内部类可以分为四种类型:成员内部类、静态内部类、局部内部类、匿名内部类。其中,成员内部类是最常用的一种形式。 成员内部类示例 下面通过一个示例来详解一下成员内部类的定义和使用: public c…

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