SpringFramework核心技术三:Spring的验证机制

2023-11-14

Spring验证

Spring 3引入了对其验证支持的几项增强。首先,现在完全支持JSR-303 Bean验证API。其次,当以编程方式使用时,Spring的DataBinder现在可以验证对象并绑定到它们。第三,Spring MVC现在支持声明性验证@Controller输入。


一、JSR-303 Bean验证API概述

SR-303标准化Java平台的验证约束声明和元数据。使用此API,您可以使用声明性验证约束对域模型属性进行注释,并且运行时会强制执行它们。有许多可以利用的内置约束条件。您也可以定义您自己的自定义约束。

为了说明,请考虑一个简单的具有两个属性的PersonForm模型:

public class PersonForm {
    private String name;
    private int age;
}

JSR-303允许你定义对这些属性的声明性验证约束:

public class PersonForm {

    @NotNull
    @Size(max=64)
    private String name;

    @Min(0)
    private int age;

}

当这个类的一个实例被JSR-303验证器验证时,这些约束将被执行。

有关JSR-303 / JSR-349的一般信息,请参阅Bean验证网站。有关默认参考实现的特定功能的信息,请参阅Hibernate Validator文档。要学习如何将Bean Validation提供者设置为Spring bean,请继续阅读。

二、配置一个Bean验证提供程序

Spring提供对Bean验证API的全面支持。这包括对作为Spring bean引导JSR-303 / JSR-349 Bean验证提供程序的方便支持。这允许一个javax.validation.ValidatorFactory或javax.validation.Validator任何需要在你的应用程序验证被注入。

使用该LocalValidatorFactoryBean配置默认的Validator作为Spring bean:

<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

上面的基本配置将触发Bean Validation使用其默认引导机制进行初始化。JSR-303 / JSR-349提供程序(如Hibernate验证程序)预计会出现在类路径中,并会自动检测到。

1.注入一个验证器

LocalValidatorFactoryBean同时实现了javax.validation.ValidatorFactory和 javax.validation.Validator,以及Spring的 org.springframework.validation.Validator。您可以将这些接口的引用注入到需要调用验证逻辑的bean中。

javax.validation.Validator如果您更愿意直接使用Bean验证API ,则注入一个引用:

import javax.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator

org.springframework.validation.Validator如果您的bean需要Spring验证API ,则注入一个引用:

import org.springframework.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;

}

2.配置自定义约束

每个Bean验证约束由两部分组成。首先,@Constraint声明约束及其可配置属性的注释。其次,实现javax.validation.ConstraintValidator约束行为的接口的实现。为了将一个声明和一个实现关联起来,每个@Constraint注解引用一个对应的ValidationConstraint实现类。在运行时,ConstraintValidatorFactory当您的域模型中遇到约束注释时, 实例化所引用的实现。

默认情况下,LocalValidatorFactoryBean配置一个SpringConstraintValidatorFactory 使用Spring来创建ConstraintValidator实例。这允许您的自定义ConstraintValidators像任何其他Spring bean一样受益于依赖注入。

下面显示的是一个自定义@Constraint声明的示例,后面跟着一个ConstraintValidator使用Spring进行依赖注入的相关 实现:

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

    @Autowired;
    private Foo aDependency;

    ...
}

如你所见,一个ConstraintValidator实现可能像其他Spring bean一样拥有@Autowired的依赖关系。

3.Spring驱动的方法验证

Bean Validation 1.1支持的方法验证功能以及Hibernate Validator 4.3的自定义扩展可以通过MethodValidationPostProcessorbean定义集成到Spring上下文中。

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

为了符合Spring驱动的方法验证条件,所有的目标类都需要使用Spring的@Validated注释进行注释,可选择声明要使用的验证组。MethodValidationPostProcessor使用Hibernate Validator和Bean Validation 1.1提供程序查看javadocs的设置细节。

4.其他配置选项

在LocalValidatorFactoryBean大多数情况下,默认配置应该足够了。从消息插值到遍历解析,各种Bean验证结构都有许多配置选项。有关LocalValidatorFactoryBean这些选项的更多信息,请参阅 javadocs。

三、配置DataBinder

自Spring 3以来,可以使用Validator配置DataBinder实例。配置完成后,可以通过调用来调用Validator binder.validate()。任何验证错误都会自动添加到活页夹的BindingResult。

以编程方式使用DataBinder时,可以在绑定到目标对象后使用它来调用验证逻辑:

Foo target = new Foo();
DataBinder binder = new DataBinder(target);
binder.setValidator(new FooValidator());

// bind to the target object
binder.bind(propertyValues);

// validate the target object
binder.validate();

// get BindingResult that includes any validation errors
BindingResult results = binder.getBindingResult();

DataBinder也可以Validator通过dataBinder.addValidators和配置多个实例 dataBinder.replaceValidators。将全局配置的Bean验证与Validator本地在DataBinder实例上配置的Spring相结合时,这非常有用。参见[validation-mvc-configurations]。

好啦,Spring的验证机制就讲到这么多啦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringFramework核心技术三:Spring的验证机制 的相关文章

  • SpringMVC是如何让Controler替代Servlet工作的

    在学到JavaEE的部分的时候 知道了我们自己写Servlet 然后来处理一个请求的get方法或者是post方法 但是在工作后 直接使用了SpringMVC的框架 工作的时候不再需要自己写Servlet 而是写一个Controler 然后将
  • java Spring调试 ApplicationContext cannot be resolved to a type

    今天开发过程中遇到了不能识别导入的Spring jar包的情况 ApplicationContext cannot be resolved to a type 本人分析情况为两种 1 导入的包错误 2 本人遇到的情况 就是jre版本过高 将
  • springboot整合springcloud进行Eureka注册及解决springcloud导包出现unknown问题

    1 什么是Spring Cloud Spring提供了一系列工具 可以帮助开发人员迅速搭建分布式系统中的公共组件 比如 配置管理 服务发现 断路器 智能路由 微代理 控制总线 一次性令牌 全局锁 主节点选举 分布式session 集群状态
  • SpringFramework核心技术一(IOC:注册一个LoadTimeWeaver)

    一 什么是LoadTimeWeaver 在LoadTimeWeaver用于由Spring动态变换的类 因为它们被装载到Java虚拟机 JVM 要启用加载时织入 请将其添加 EnableLoadTimeWeaving到您的某个 Configu
  • SpringBoot启动时做了哪些工作(同花顺面试篇)

    在北漂了几个月后 拿到了几个还行的offer 然后跑来了心心念念的杭州 讲实话 杭州各方面我还是比较有好感的 如果非要说一点不好的 那一定是 杭州太不尊重冬天了 你品 你细品 鄙人目前虽然是在摄像头大厂混吃混喝 但是面对她的主动邀请 同花顺
  • 源码大杀器:怎样查看源码

    一 以SpringBoot来分析下 首先获取到源码 二 点击GitHub获取源码 三 下载源码 SpringSpace 11 24 24 ls emptydemo springdemo gs accessing data jpa maste
  • idea微服务报错找不到符号

    idea版本 2021 2 3 最近做微服务项目时 启动某个服务时总是遇到找不到符号 找不到方法 找不到包的报错 但之前却一切正常 不可能是代码的问题 看了很多博客也没能解决问题 经过不断的尝试 自己总结了一套治标不治本的解决方法 1 点击
  • Spring框架概述 --- AOP, 拦截器, 过滤器

    Spring框架概述 AOP 拦截器 过滤器 AOP概念 过滤器 Filter 拦截器 Interceptor Spring AOP AOP Example Log Aspect 执行顺序是 过滤器 gt 拦截器 gt AOP AOP概念
  • Spring框架(SpringBoot)中redis报错(Could not get a resource from the pool、java.net.SocketTimeoutException)

    Spring框架 SpringBoot 中redis报错 在使用SpringBoot框架的时候 Spring一直会报两个特别纠结特别的烦的错误 尝试了很多种方法 都是失败的 不能成功 经过我坚持不懈的努力寻找 终于把问题给解决了 一 第一个
  • Spring框架详解(三)

    一 代理模式 代理模式 为一个对象提供一个替身 以控制对这个对象的访问 即通过代理对象访问目标对象 这样做的好处就是 可以在目标对象实现的基础上 增强额外的功能操作 即扩展目标对象的功能 被代理对象可以是远程对象 创建开销大的对象或者是需要
  • SpringFramework核心技术五:面向切面编程(AOP)和代理机制

    AOP与代理 Spring AOP使用JDK动态代理或CGLIB为给定目标对象创建代理 只要有选择 JDK动态代理就是首选 一 代理机制 如果要代理的目标对象实现至少一个接口 则将使用JDK动态代理 目标类型实现的所有接口都将被代理 如果目
  • SpringFramework核心技术一(IOC:使用ICO容器)

    使用容器 这ApplicationContext是高级工厂的接口 能够维护不同bean及其依赖项的注册表 使用该方法T getBean String name Class requiredType 可以检索bean的实例 一 在Applic
  • 解决java.lang.IllegalArgumentException: 'Content-Type' cannot contain wildcard type '*'异常(真实有效)

    FastJson版本升级 这个bug的产生很大程度上是因为你更新了FastJson的版本 一 看一下这个Bug org springframework web util NestedServletException Request proc
  • Spring——事务注解@Transactional【建议收藏】

    在某些业务场景下 如果一个请求中 需要同时写入多张表的数据或者执行多条sql 为了保证操作的原子性 要么同时成功 要么同时失败 避免数据不一致的情况 我们一般都会用到事务 Spring框架下 我们经常会使用 Transactional注解来
  • Spring框架详解(二)

    一 IOC基本原理 1 什么是IOC容器 容器 容器是一种为特定组件的运行提供必要支持的一个软件环境 例如Tomcat就是一个Servlet容器 它可以为Servlet的运行提供运行环境 类似Docker这样的软件也是一个容器 它提供了必要
  • Handler和Controller的区别

    以前一直以为这两个概念貌似是没有太大的区别 调研发现还是有一些区别的 Handler HandlerMapping接口实现从URL映射到请求处理程序bean 支持映射到bean实例和bean names Controller Base Co
  • SpringBoot项目多环境配置(亲测有效)

    SpringBoot项目多环境配置 SpringBoot项目在多环境配置上表现的非常优秀 只需要非常简单的操作就可以完成配置 一 认识配置文件 在创建项目后 会看到一个resources目录下有一个application propertie
  • Spring框架-入门(IOC,DI)

    文章目录 Spring框架 简介 创建Spring项目 理解IOC和DI IOC控制反转 示例
  • Spring框架-Spring Bean管理

    文章目录 Spring Bean管理 Spring Bean 配置方式 使用XML配置方式 User java
  • Spring框架-入门(IOC,DI)

    文章目录 Spring框架 简介 创建Spring项目 理解IOC和DI IOC控制反转 示例

随机推荐

  • linux磁盘分区以及配置文件设置

    硬盘分区有三种 主磁盘分区 83 扩展磁盘分区 5 逻辑分区 包括swap交换分区82 一个硬盘主分区至少有1个 最多4个 扩展分区可以没有 最多1个 且主分区 扩展分区总共不能超过4个 逻辑分区可以有若干个 交换分区必须存在但一般不用 补
  • hdu 6121 Build a tree

    Problem acm hdu edu cn showproblem php pid 6121 Meaning 一棵 n 个点的完全 k 叉树 结点标号从 0 到 n 1 求以每一棵子树的大小的异或和 Analysis 一层层地统计答案 找
  • LED 数码管共阴共阳的区别+静态/动态显示

    51单片机 数码管动态显示 1 共阴共阳定义 LED 共阴极指的是LED共同的接点是GND 接地 而共阳极指的是LED共同的接点是电源 LED亮灯的条件是两端有电势差 最后一段h dp小数点在高位 第一段a在低位 hgfedcba xxxx
  • 【算法学习笔记】19:拓扑排序

    1 简述 计算拓扑序列的一个方式是 用BFS来尝试访问所有的节点 但是有一个约束就是只有入度为 0 0 0的节点才能被加入到扩展队列里 每次从队列里取出一个节点 也就同时在图中将这个节点拆除 所以它的所有后继的节点都减少 1 1 1 如果已
  • STM32使用串口(空闲中断IDLE+DMA)接收ESP8266数据

    串口空闲中断 ESP8266收发数据 一 在使用ESP8266模块时遇到的一些问题 首先是对模块数据的收发 我们在发送AT指令时会收到模块发送的反馈数据 在我们没有使用实时操作系统的情况下 通过HAL库的串口收发函数是比较难以完成工作的 我
  • aaa计费请求_什么是AAA(身份验证,授权和计费)?

    aaa计费请求 AAA or Authentication Authorization and Accounting is a term used to describe 3 functions in IT Mainly AAA is us
  • 导航样式

    鼠标滑过 bottom 黄线从中间展开到两边
  • NLP: 0基础应用T5模型进行文本翻译代码实例~

    文章目录 前言 一 目标文本是什么 二 模型调用步骤 1 引入库 2 导入模型 本文使用 t5 base 3 使用分词器对目标文本进行分词 4 对刚刚生成的分词结果进行目标语言的生成工作 5 对生成的目标语言进行解码工作 就可得到目标语言的
  • 一文读懂Matter协议的前世今生和未来

    从事Zigbee行业的应该都知道今年Zigbee联盟已经改名为CSA联盟 并推出一个全新的 定位于解决IOT碎片化的统一协议 即Matter协议 Matter协议的由来 Matter协议的前身CHIP Connected Home Over
  • 从一个数组中随机取出若干个数

    随机取数 下面给出从一个数组随机取出若干数字组成新书组和从一个数组随机取出一个数字的方法 代码如下 从一个数组中随机取出若干个元素组成数组 param Array arr 原数组 param Number count 需要随机取得个数 co
  • 如何确保事务提交后才执行异步操作

    参考博客TransactionSynchronizationManager和TransactionSynchronizationAdapter 场景 业务流程背景 对于 法律法规 法规库 标签管理 列表中的某一条数据 操作完标注和解析按钮后
  • Angular离线API文档安装指南

    需要的材料 nginx 官方angularjs zip 完整包 步骤 1 先上www angular org 下载个完整的zip包 2 到nginx 网站下载 nginx 3 修改 nginx 1 6 2 conf nginx conf 文
  • 利用win10自带的工具测硬盘读写速度

    利用win10自带的硬盘测试工具测读写速度 一 win q 打开搜索框 输入 cmd 找到命令提示符 右击以管理员身份运行 二 在命令框里输入 winsat disk 是默认测试系统盘的速度 不出意外都是C盘 三 当我们要想测试其他盘的时候
  • MySQL学习笔记——MySQL数据类型(拉勾教育数据分析实战训练营学习笔记)

    MySQL学习笔记 MySQL数据类型 MySQL数据库中 每一条数据都有其数据类型 主要可以分为数值型 字符串型和日期时间型三大类 说明如下所示 数值类型 TINYINT 一个非常小的整数 占1字节 如果是有符号 范围是 128 127
  • MFC窗口销毁过程

    MFC窗口销毁过程 考虑单窗口情况 假设自己通过new创建了一个窗口对象pWnd 然后pWnd gt Create 则销毁窗口的调用次序 1 手工调用pWnd gt DestroyWindow 2 DestroyWin
  • Elasticsearch实战-磁盘IO被打满

    背景 事情是这样的 一天下午4点42分左右 业务反馈我开发的服务在测试环境出现问题 返回资源数据是0 查日志发现是ES访问超时 相当于数据库挂了 持续了20多分钟自己恢复 咨询了ES团队 最终得到下面的答复 当前集群现状 1 当前集群数据I
  • python爬取研究生招生网招生信息

    import requests from bs4 import BeautifulSoup from pandas core frame import DataFrame import re import time class Gradua
  • Nginx惊群问题

    Nginx惊群问题 1 简介 简单来说 多线程 多进程 linux下线程进程也没有多大区别 等待同一个socket事件 当这个事件发生时 这些线程 进程被同时唤醒 就是惊群 可以想见 效率很低下 许多进程被内核重新调度唤醒 同时去响应这一个
  • 07.JavaWeb-Vue+elementUI

    1 Vue 功能替代JavaScript和jQuery 基于JavaScript实现的前端框架 1 1配置Vue 1 1 1引入vue库 方法一 通过cdn链接引入最新版本的vue 可能会慢些 方法二 将vue库下载到本地 通过相对路径引入
  • SpringFramework核心技术三:Spring的验证机制

    Spring验证 Spring 3引入了对其验证支持的几项增强 首先 现在完全支持JSR 303 Bean验证API 其次 当以编程方式使用时 Spring的DataBinder现在可以验证对象并绑定到它们 第三 Spring MVC现在支