SpringMVC全局异常处理+拦截器使用+参数校验

news/2025/2/2 11:06:30/文章来源:https://www.cnblogs.com/fji888/p/18696719

SpringMVC全局异常处理+拦截器使用+参数校验

SpringMVC 是 Spring 框架中用于构建 Web 应用程序的模块。为了提高应用程序的稳定性和用户体验,全局异常处理、拦截器的使用和参数校验是必须掌握的技术。以下将详细介绍这些内容。

全局异常处理

全局异常处理能够有效捕获并处理应用程序中的异常,防止异常信息直接暴露给用户,从而提高应用的安全性和用户体验。

1. 使用 @ControllerAdvice 注解

@ControllerAdvice 是 Spring 提供的一个用于全局处理控制器里异常的注解。它可以捕获所有控制器中的异常,并进行统一处理。

示例代码:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public ResponseEntity<String> handleException(Exception e) {return new ResponseEntity<>("服务器内部错误:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}@ExceptionHandler(IllegalArgumentException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException e) {return new ResponseEntity<>("无效参数:" + e.getMessage(), HttpStatus.BAD_REQUEST);}
}
​
 
 

在上述代码中,@ExceptionHandler 注解指定了不同的异常处理方法,@ResponseStatus 注解用于设置返回的 HTTP 状态码。

2. 使用 @ExceptionHandler 注解

@ExceptionHandler 注解可以直接在控制器中使用,用于处理特定方法的异常。

示例代码:

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus;@Controller
public class MyController {@RequestMapping("/example")public String exampleMethod() {// 代码可能抛出异常throw new IllegalArgumentException("Invalid argument");}@ExceptionHandler(IllegalArgumentException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public String handleIllegalArgumentException(IllegalArgumentException e) {return "error/400"; // 返回视图名}
}
​
 
 

拦截器的使用

拦截器(Interceptor)是 AOP(面向切面编程)在 Spring 中的应用之一,可以在请求到达控制器之前和之后执行逻辑,用于处理身份验证、日志记录等任务。

1. 实现 HandlerInterceptor 接口

要创建一个拦截器,需要实现 HandlerInterceptor 接口,并重写其方法。

示例代码:

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 请求处理之前执行System.out.println("拦截器:请求处理之前");return true; // 返回 true 表示继续处理请求,返回 false 表示中断请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 请求处理之后,视图渲染之前执行System.out.println("拦截器:请求处理之后,视图渲染之前");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 完全处理完请求之后执行System.out.println("拦截器:请求完全处理之后");}
}
​
 
 

2. 注册拦截器

拦截器需要在配置类中注册才能生效。

示例代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**"); // 拦截所有请求}
}
​
 
 

参数校验

参数校验是确保传入的请求参数符合预期的一种手段,可以有效防止无效数据导致的异常和错误。

1. 使用 JSR-303/JSR-380 注解

Spring MVC 支持 JSR-303/JSR-380(Bean Validation),可以使用注解对请求参数进行校验。

示例代码:

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;public class User {@NotBlank(message = "用户名不能为空")@Size(min = 3, max = 20, message = "用户名长度必须在3到20之间")private String username;@NotBlank(message = "密码不能为空")@Size(min = 6, max = 20, message = "密码长度必须在6到20之间")private String password;// Getter 和 Setter
}
​
 
 

2. 在控制器中使用 @Valid 注解

在控制器方法参数中使用 @Valid 注解进行参数校验,并使用 BindingResult 对象捕获校验结果。

示例代码:

import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@PostMapping("/register")public ResponseEntity<String> register(@Valid @RequestBody User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return new ResponseEntity<>(bindingResult.getFieldError().getDefaultMessage(), HttpStatus.BAD_REQUEST);}return new ResponseEntity<>("注册成功", HttpStatus.OK);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877952.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 编译静态链接 (-static)

因为很长一段时间内并不知道这个编译参数究竟是干什么用的,只知道这个参数在 NOI 系列赛事中普遍使用,并且会导致编译输出文件变大,直到碰到具体问题了才发现这个参数的作用 -static 参数是静态链接开关,不加这个参数默认是动态链接,加上这个参数以后是静态链接,先说一下…

https://avoid.overfit.cn/post/e57ca7e30ea74ad380b093a2599c9c01

DeepSeekMoE是一种创新的大规模语言模型架构,通过整合专家混合系统(Mixture of Experts, MoE)、改进的注意力机制和优化的归一化策略,在模型效率与计算能力之间实现了新的平衡。DeepSeekMoE架构融合了专家混合系统(MoE)、多头潜在注意力机制(Multi-Head Latent Attention, ML…

DeepSeekV3+Roo Code,智能编码好助手

前言 硅基流动最近上线了deepseek-ai/DeepSeek-R1与deepseek-ai/DeepSeek-V3,感兴趣快来试试吧! 邀请注册得14元不过期额度:https://cloud.siliconflow.cn/i/Ia3zOSCU。实践 最近VS Code中的自动编程插件Cline很火爆,Roo Code也是Cline的一个fork版本。 Cline 自主编码代理…

Cisco Catalyst 8000V Edge Software, IOS XE Release 17.16.1a ED - 思科虚拟路由器系统软件

Cisco Catalyst 8000V Edge Software, IOS XE Release 17.16.1a ED - 思科虚拟路由器系统软件Cisco Catalyst 8000V Edge Software, IOS XE Release 17.16.1a ED 思科 Catalyst 8000V 边缘软件 - 虚拟路由器 请访问原文链接:https://sysin.org/blog/cisco-catalyst-8000v/ 查看…

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release 17.16.1a ED - 思科路由器系统软件

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release 17.16.1a ED - 思科路由器系统软件Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release 17.16.1a ED 思科 Catalyst 8000 边缘平台系列 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-cat…

Easysearch 集群通过 API 进行用户密码重置

在日常使用 Easysearch 中,难免会遇到集群密码需要重置的情况(如密码遗失、安全审计要求等)。 通过查看 Easysearch 用户接口文档,创建用户使用如下接口: PUT _security/user/<username> {"password": "adminpass","roles": ["m…

Elasticvue:一款轻量级的Elasticsearch可视化管理工具

Elasticvue是一款免费开源的Elasticsearch GUI工具,你可以使用它来管理ES里的数据, Elasticvue具有多种安装形式,我们这里采用最简单的Docker安装方式,其他版本如Winodws、MacOS、Linux和浏览器插件。 Elasticvue相比Kibana的优势主要体现在以下几个方面: 1、 轻量级与易用…

【攻防3.0 】信任攻击

Author: sm0nk@深蓝攻防实验室 上周在一个技术沙龙我分享了一个攻防相关议题——进击的白巨人,在此归档。一、进攻场景思考 无论是端侧产品还是流量侧产品、亦或是原生安全还是外挂式,主模式还是鉴黑和鉴白; 随着防守方强化的安全建设,安全产品越来越强,进攻的难度在增加;…

[2025.2.1 MySQL学习] MVCC

MVCC 基本概念当前读(直接读取数据页最新版本):读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于一些日常操作,如:select...lock in share mode、select ... for update、update、isnert、delete都是一种当前读快照读:…

母婴app

您好!这是一个非常全面的母婴健康管理APP构想。让我帮您从技术角度分析并提供一个基础的项目结构建议。 技术架构建议 1. 前端技术栈:- iOS: Swift/SwiftUI - Android: Kotlin - 跨平台选项: Flutter/React Native2. 后端技术栈:- 主服务框架: Spring Boot - 数据库: - MySQL …

毕设学习第六天SSM框架之Spring5

虽然目前spring已经出现了6但是现如今大多数应用的还是spring5,因此毕设学习选择Spring5而非6 spring简介Spring 是一个开源的 Java 企业级应用开发框架,旨在简化企业级 Java 应用的开发过程。它通过控制反转(IOC)和面向切面编程(AOP)等核心技术,帮助开发人员构建松耦合…

心态急躁,什么事都做不成

春节这几天,心态有些急躁。也许是突如其来的放松让大脑不适应,最近做事(尤其是打游戏)不顺。 比如体现在炉石酒馆,农,围棋这三者上。这三个是2/1号我从外面回来之后进行的三项娱乐活动。 首先先打了几把炉石,一把速七,两把速八,再加上之前的两把速七速八,让我直接从8…