博客
关于我
Spring 5 中文解析之核心篇-数据绑定、校验和类型转换
阅读量:877 次
发布时间:2019-03-21

本文共 3020 字,大约阅读时间需要 10 分钟。

Spring框架中的数据绑定与验证详解

关于作者

本文作者是从事金融行业及大数据技术的专家,为金融行业相关技术团队提供专业的技术支持,包括系统集成、自动化部署以及分布式微服务开发,同时热衷于技术分享,致力于为开发者提供高质量的技术内容。

博客地址:http://youngitman.tech

CSDN:https://blog.csdn.net/liyong1028826685


Spring框架中的数据绑定与验证

Spring框架提供了强大的数据绑定和验证功能,能够灵活地处理用户输入和对象属性。以下是Spring中核心的技术点和实现细节。

1. Spring的校验接口与实现

Spring提供了一个Validator接口,该接口用于定义校验逻辑。对于普通对象的验证,可以通过实现Validator接口的方法validate进行业务逻辑验证。以下是Person类的校验实现示例:

public class PersonValidator implements Validator {    @Override    public boolean supports(Class
clazz) { return Person.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { // 验证name字段不为空 ValidationUtils.rejectIfEmpty(errors, "name", "name.empty"); // 验证年龄是否在合理范围内 Person p = (Person) target; if (p.getAge() < 0) { errors.rejectValue("age", "negativevalue"); } else if (p.getAge() > 110) { errors.rejectValue("age", "too.darn.old"); } }}

此外,ValidationUtils类提供了多种静态方法,可以用来快速添加验证错误。

2. 数据绑定与Spring的数据绑定

Spring的DataBinder功能可以将用户输入的原始值与应用程序的域模型进行动态绑定。在Web层中,通过@Bind注解或<spring:bind>标签进行绑定操作。DataBinder还支持指定验证逻辑,确保数据的完整性和有效性。

3. BeanWrapper与属性操作

BeanWrapper是Spring中一个核心组件,能够对 Bean 实例进行属性操作。它支持以下功能:

  • 属性值的设置与获取(单个或批量操作)
  • �嵌套属性的处理
  • 添加PropertyChangeListenersVetoableChangeListeners
  • 支持索引属性(如数组、列表等)

BeanWrapper通常由DataBinderBeanFactory使用,而不是直接从应用程序代码中使用。

4. 自定义属性编辑器

Spring支持通过自定义实现PropertyEditor来实现属性格式化和转换。以下是一些常用的属性编辑器实现:

  • ByteArrayPropertyEditor:处理字节数组转换
  • ClassEditor:将类名字符串转换为类对象
  • CustomBooleanEditor:自定义布尔值编辑器
  • CustomDateEditor:根据DateFormat格式处理日期

通过注册自定义PropertyEditor,可以实现复杂的属性转换需求。

5. 类型转换与ConversionService

Spring 3引入了core.convert包,提供了一套统一的类型转换系统。通过ConversionService,可以实现从一种类型到另一种类型的转换逻辑。以下是几个关键接口:

  • Converter:灵活的类型转换接口
  • ConverterFactory:用于集成多个转换器
  • GenericConverter:支持多种源类型和目标类型的转换
  • ConditionalConverter:基于条件进行转换,只有特定类型或特定注解的字段进行转换

6. 格式化与Spring的Formatter

为支持本地化和格式化需求,Spring提供了Formatter SPI。通过实现PrinterParser接口,可以对字段进行格式化处理。以下是一些常见的Formatter实现:

  • DateFormatter:格式化日期
  • NumberStyleFormatter:格式化数字
  • CurrencyStyleFormatter:格式化货币
  • PercentStyleFormatter:格式化百分比

通过注解驱动格式化,可以在字段上直接使用格式化规则。

7. Bean验证与约束配置

Spring支持Java Bean验证,通过注解约束和自定义ConstraintValidator实现来定义验证逻辑。以下是自定义约束的示例:

public @interface MyConstraint {    @Validated(@Validated(stashed=true))    @Constraint(validatedBy=MyConstraintValidator.class)    String name();}

通过配置LocalValidatorFactoryBean,可以将Bean验证集成到Spring应用中,并支持方法验证和注解驱动验证。


配置与使用示例

1. 配置ConversionService

为了使用ConversionService,需在Spring配置文件中注册转换器:

2. 注解驱动格式化

在字段上使用注解驱动格式化:

public class MyModel {    @DateTimeFormat(iso = DateTimeFormat.ISO_DATE)    private Date date;}

3. 数据绑定与验证

在控制器中使用DataBinder进行数据绑定并添加验证:

@Controllerpublic class UserController {    @Autowired    private DataBinder binder;    @GetMapping("/user")    public String index(@Validated(ApplicationValidator.class) User user) {        binder.validate();        return "index";    }}

参考资源

  • 博客地址:http://youngitman.tech
  • CSDN文章:https://blog.csdn.net/liyong1028826685
你可能感兴趣的文章
parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
查看>>
parallelStream导致LinkedList遍历时空指针的问题
查看>>
Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
查看>>
ParameterizedThreadStart task
查看>>
Spring security之管理session
查看>>
paramiko模块
查看>>
param[:]=param-lr*param.grad/batch_size的理解
查看>>
spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
查看>>
Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
查看>>
Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
查看>>
Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
查看>>
ParseChat应用源码ios版
查看>>
Part 2异常和错误
查看>>
Pascal Script
查看>>
Spring Boot集成Redis实现keyspace监听 | Spring Cloud 34
查看>>
Spring Boot中的自定义事件详解与实战
查看>>
Passport 密码模式
查看>>
Spring Boot(七十六):集成Redisson实现布隆过滤器(Bloom Filter)
查看>>
passwd命令限制用户密码到期时间
查看>>
Spring @Async执行异步方法的简单使用
查看>>