springmvc-JSR303进行服务端校验分组验证SpringMVC定义Restfull接口异常处理流程RestController异常处理

本文主要是介绍springmvc-JSR303进行服务端校验分组验证SpringMVC定义Restfull接口异常处理流程RestController异常处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录&

1. JSR303

2. JSR303中含有的注解

3. spring中使用JSR303进行服务端校验

3.1 导入依赖包

3.2 添加验证规则

3.3 执行校验

4. 分组验证

4.1 定义分组验证规则

 4.2 验证时通过参数指定验证规则

4.3 验证信息的显示 

5. SpringMVC定义Restfull接口

5.1 增加spring配置

5.2 Controller

5.3 格式化返回数据

5.4 Restfull接口验证失败处理

1. 为什么使用全局一场处理

2. 异常处理流程

3. SpringMVC异常分类

4. 使用示例

4.1 SpringMVC自带的简单异常处理器

4.2 通过接口实现全局异常

4.3 使用注解方式定义全局异常

4.4 RestController异常处理


1. JSR303

JSR303是Java为Bean数据合法性校验提供给的标准框架,已经包含在 JavaEE6.0中,JSR303通过在Bean 属性中标注类似 @NotNull @Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean进行验证。

2. JSR303中含有的注解

@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式


Hibernate Validator 附加的注解
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

注:HIbernate Validator是JSR303的一个参考实现,除了支持所有标准的校验注解外,另外HIbernate Validator还有JSR-380的实现

3. spring中使用JSR303进行服务端校验

3.1 导入依赖包

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.7.Final</version>
</dependency>

3.2 添加验证规则

3.3 执行校验

在请求处理方法中,使用@Validated或@Valid注解要验证的对象,并根据BindingResult判断校验是否通过, 另外,验证参数后必须紧跟BindingResult参数,否则spring会在校验不通过时直接抛出异常。

注:@Valid和@Validated的区别
两者的作用是一样的,但@Validated功能更丰富,有分组功能。

4. 分组验证

学生ID号由数据库自增生成,在新增学生时不需要要传入,但在修改学生信息时需要通过ID号进行修改,所以需要传达ID号,再在这时就需要分组验证了。

4.1 定义分组验证规则

 4.2 验证时通过参数指定验证规则

4.3 验证信息的显示 

5. SpringMVC定义Restfull接口

在前后端分离开发中,服务端通过Json对象返回数据给前端使用。

5.1 增加spring配置

<!-- 转换器,将返回消息转换为json -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters"><list><ref bean="mappingJackson2HttpMessageConverter"/></list>
</property>
</bean><!-- 处理中文编码,(spring通过该配置自动设置响应头)-->
<bean id="mappingJackson2HttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
<property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>text/json;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list>
</property>
</bean>

 

注:spring为简化开发提供了丰富的组件,在使用时需要将组件配置到spring中,并为这些组件提供合适的参数。

5.2 Controller

5.3 格式化返回数据

在前后端分离模式的开发中,提供给前端使用的数据(或提供给第三方系统)通常需要按双方协商定义的格式返回,以方便解析。一般有两种处理方式:1)将用户Map组织格式化返回的数据,2)定义一个放回数据的实体来格式化返回的数据。

定义数据返回格式:

 

输入http://localhost:8080/rest/loadStudent?sid=6测试返回的数据。(按自己测试数据输入条件)

转换JSON时常用的注解: 忽略:JsonIgnore, 取别名@JsonProperty("xxx"), 指定转换的日期格式@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"), 指定日期格式时还可以指定时区,如:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

说明:GMT 就是格林威治标准时间的英文缩写(Greenwich Mean Time 格林尼治标准时间),是世界标准时间,gmt+8 是格林威治时间+8小时,中国所在时区就是gmt+8

5.4 Restfull接口验证失败处理

 

1. 为什么使用全局一场处理

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

2. 异常处理流程

系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

3. SpringMVC异常分类

1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
3)使用@ControllerAdvice + @ExceptionHandler

4. 使用示例

4.1 SpringMVC自带的简单异常处理器

SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口

1)在spring-mvc.xml 中加入如下配置

 <!-- springmvc提供的简单异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 定义默认的异常处理页面 ,需要在WEB-INF/jsp 下定义error.jsp 错误页面 --><property name="defaultErrorView" value="error"/><!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> <property name="exceptionAttribute" value="ex"/><!-- 定义需要特殊处理的异常,这是重要点 --> <property name="exceptionMappings"><props><prop key="java.lang.RuntimeException">error</prop></props><!-- 还可以定义其他的自定义异常 --></property></bean> 

 2)配置错误页面
在WEB-INF/jsp 目录下,创建error.jsp, 与上面的spring-mvc.xml中的配置相对应

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>系统异常,请与管理员联系</h1>
</body>
</html>

3)可以在Controller中直接抛出一个异常进行测试。

4.2 通过接口实现全局异常

通过实现异常处理处理接口HandlerExceptionResovler处理全局异常。

1) 实现接口

@Component
public class GlobalException implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {ModelAndView mv = new ModelAndView();mv.setViewName("error");if(ex instanceof RuntimeException) {mv.addObject("msg", ex.getMessage());}return mv;}
}

注意: 使用这种方式,请将spring-mvc.xml中配置的全局异常删除。

4.3 使用注解方式定义全局异常

定义全局异常处理器:

@ControllerAdvice
public class HandlerGlobalException {@ExceptionHandlerpublic ModelAndView handler(Exception ex) {ModelAndView mv = new ModelAndView();if(ex instanceof RuntimeException) {mv.addObject("msg", ex.getMessage());}mv.setViewName("error");//如果系统直接返回JSON格式的错误数据,可以如下操作//mv.setView(new MappingJackson2JsonView());return mv;}}

4.4 RestController异常处理

处理上面的mv.setView(new MappingJackson2JsonView());这种方式,来将错误信息使用JSON方式返回外,还可以使用如下方式:

@RestControllerAdvice = @ControllerAdvice + @ResponseBody

@RestControllerAdvice
public class HandlerRestGlobalException {@ExceptionHandlerpublic Map<String,Object> handler(Exception e) {Map<String,Object> map = new HashMap<>();if(e instanceof RuntimeException) {map.put("cod", -1);map.put("msg", e.getMessage());}return map;}
}

注意:返回JSON格式的数据,需要Jackson的支持,在pom.xml中加入jackson的依赖

        <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency>

这篇关于springmvc-JSR303进行服务端校验分组验证SpringMVC定义Restfull接口异常处理流程RestController异常处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/187

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum