Spring Boot中Web应用的统一异常处理实战

本文详细介绍如何在SpringBoot项目中实现全局异常处理,包括创建全局异常处理类、显示错误页面、自定义异常及JSON响应处理。通过示例代码讲解@ControllerAdvice注解的使用,以及如何针对不同类型的异常进行定制化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一 创建全局异常处理类

package com.didispace.exception;

import com.didispace.dto.ErrorInfo;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
//通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。
@ControllerAdvice
public class GlobalExceptionHandler {
    //@ExceptionHandler用来定义函数针对的异常类型
    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", req.getRequestURL());
        //将Exception对象和请求URL映射到error.html中
        mav.setViewName("error");
        return mav;
    }
    //@ExceptionHandler用来定义函数针对的异常类型
    @ExceptionHandler(value = MyException.class)
    //在@ExceptionHandler之后加入@ResponseBody,就能让处理函数return的内容转换为JSON格式。
    @ResponseBody
    public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception {
        //为MyException异常创建对应的处理
        ErrorInfo<String> r = new ErrorInfo<>();
        r.setMessage(e.getMessage());
        r.setCode(ErrorInfo.ERROR);
        r.setData("Some Data");
        r.setUrl(req.getRequestURL().toString());
        return r;
    }

}

二 显示错误展示模板

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title>统一异常处理</title>
</head>
<body>
<h1>Error Handler</h1>
<div th:text="${url}"></div>
<div th:text="${exception.message}"></div>
</body>
</html>

三 新增pom

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

四 新建控制器

package com.didispace.web;

import com.didispace.exception.MyException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*
在Controller中抛出Exception,当然我们可能会有多种不同的Exception。然后在@ControllerAdvice类中,根据抛出的具体Exception类型匹配@ExceptionHandler中配置的异常类型来匹配错误映射和处理。
*/
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String hello() throws Exception {
        throw new Exception("发生错误");
    }

    //抛出MyException异常
    @RequestMapping("/json")
    public String json() throws MyException {
        throw new MyException("发生错误2");
    }
}

五 创建错误信息类

/*
创建统一的JSON返回对象
*/
package com.didispace.dto;

public class ErrorInfo<T> {

    public static final Integer OK = 0;
    public static final Integer ERROR = 100;

    private Integer code;  //消息类型
    private String message;  //消息内容
    private String url;  //请求的url
    private T data;  //请求返回的数据

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public static Integer getOK() {
        return OK;
    }

    public static Integer getERROR() {
        return ERROR;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
    
}

六 创建一个自定义异常

/*
用来实验捕获该异常,并返回json
*/
public class MyException extends Exception {

    public MyException(String message) {
        super(message);
    }
    
}

七 测试

1 测试Exception

浏览器输入:http://localhost:8080/hello

2 测试MyException

浏览器输入:http://localhost:8080/json

 

<think>好的,我现在需要帮助用户了解如何在Kimi平台或工具中使用自定义模板。根据用户提供的引用内容,我需要仔细分析已有的信息,然后整理出一个清晰的步骤指南。 首先,查看用户提供的引用内容。引用[1]提到Kimi提供了多种模板,用户可以根据场景、风格颜色选择模板。引用[2]说明了Kimi的制作流程包括输入内容、生成、选择模板编辑优化。引用[3][4]更多是关于Kimi+的功能API集成,可能暂时不相关。因此,主要参考引用[1][2]。 接下来,用户询问的是“自定义模板”的使用方法。但现有的引用中没有直接提到“自定义模板”,只提到了选择现有模板。可能需要推测,或者指出当前可能不支持完全自定义模板,但可以通过选择模板后进行编辑优化来间接实现自定义。 根据引用[2]的步骤,用户在选择模板后可以编辑优化,这可能包括修改颜色、字体、布局等,从而达到类似自定义的效果。因此,可能需要将步骤分为选择现有模板后续编辑优化部分,建议用户通过这些步骤来实现自定义模板的需求。 另外,需要检查是否有遗漏的信息。引用中没有提到上传自己的模板文件,因此可能Kimi目前不支持用户上传自定义模板,而是提供丰富的预设模板供选择调整。因此,回答需要明确说明这一点,避免误导用户。 最后,组织回答结构:先说明当前是否支持自定义模板,然后详细步骤如何选择调整模板,最后给出相关建议或替代方法。</think>以下是关于在Kimi平台中使用模板的详细说明: ### Kimi平台模板使用方法 1. **进入模板选择界面** 创建PPT时,点击「模板选择」按钮进入模板库页面[^1]。系统提供**商务、教育、科技、创意**等多种分类模板,支持按场景、风格、颜色进行筛选。 2. **模板选择策略** - **按场景匹配**:例如学术报告优先选择简洁学术风模板,产品发布会适合动态视觉效果强的模板 - **按元素自定义**:选定基础模板后,可通过编辑功能调整配色方案(如将冷色调改为企业VI色)、替换字体(如标题改用思源黑体)、增减动画效果[^2] 3. **实现自定义效果的替代方案** Kimi目前暂不支持直接上传自定义模板文件,但可通过以下方式实现高度定制化: - **修改母版布局**:在编辑模式下调整页眉页脚位置、LOGO水印等重复元素 - **组件替换**:保留模板交互逻辑(如时间轴动画),替换其中的图标、图表数据源 - **样式继承**:复制某页设计风格(如配色+字体组合),批量应用到其他页面 ```python # 示例:通过API调用模板参数(需参考开发文档[^4]) def apply_template(template_id): api_endpoint = "https://api.moonshot.cn/v1/templates/apply" payload = { "presentation_id": "current_ppt_id", "template_id": template_id, "custom_styles": { "primary_color": "#2A5CAA", "font_family": "Microsoft YaHei" } } response = requests.post(api_endpoint, json=payload) return response.status_code ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值