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

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

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的验证机制就讲到这么多啦。

目录
相关文章
|
2月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
278 0
|
3月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
324 0
|
2月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
189 1
|
2月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
320 1
|
2月前
|
Java 数据库连接 开发者
Spring Framework 核心技术详解
本文档旨在深入解析 Java Spring Framework 的核心技术原理与应用。与侧重于快速开发的 Spring Boot 不同,本文将聚焦于 Spring 框架本身的设计理念、核心容器、控制反转(IoC)、面向切面编程(AOP)、数据访问与事务管理等基础且强大的模块。通过理解这些核心概念,开发者能够更深刻地领悟 Spring 生态系统的设计哲学,并具备解决复杂企业级应用开发问题的能力。
196 4
|
3月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
315 2
|
2月前
|
监控 Java API
Spring WebFlux 响应式编程技术详解与实践指南
本文档全面介绍 Spring WebFlux 响应式编程框架的核心概念、架构设计和实际应用。作为 Spring 5 引入的革命性特性,WebFlux 提供了完全的响应式、非阻塞的 Web 开发栈,能够显著提升系统的并发处理能力和资源利用率。本文将深入探讨 Reactor 编程模型、响应式流规范、WebFlux 核心组件以及在实际项目中的最佳实践,帮助开发者构建高性能的响应式应用系统。
455 0
|
2月前
|
监控 Cloud Native Java
Spring Integration 企业集成模式技术详解与实践指南
本文档全面介绍 Spring Integration 框架的核心概念、架构设计和实际应用。作为 Spring 生态系统中的企业集成解决方案,Spring Integration 基于著名的 Enterprise Integration Patterns(EIP)提供了轻量级的消息驱动架构。本文将深入探讨其消息通道、端点、过滤器、转换器等核心组件,以及如何构建可靠的企业集成解决方案。
213 0
|
2月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
379 0
|
2月前
|
安全 Java 数据安全/隐私保护
Spring Security 核心技术解析与实践指南
本文档深入探讨 Spring Security 框架的核心架构、关键组件和实际应用。作为 Spring 生态系统中负责安全认证与授权的关键组件,Spring Security 为 Java 应用程序提供了全面的安全服务。本文将系统介绍其认证机制、授权模型、过滤器链原理、OAuth2 集成以及最佳实践,帮助开发者构建安全可靠的企业级应用。
164 0