Spring boot - @Validated @Valid 优雅校验

写在开头

编写不易,如有问题欢迎留言。转载请带原文链接

使用场景

1.Spring MVC 传入参数校验 结合@ControllerAdvice || @RestControllerAdvice
2.结合@ConfigurationProperties 从yml || properties中读取配置构造bean时候使用
3.结合@Value可以对@Value值做校验
4.实际业务中Service层也有公司用来校验

常见组合用法

1.如果使用@ConfigurationProperties || @Value对配置做校验,常搭配META-INF/additional-spring-configuration-metadata-json ,META-INF/spring-configuration-metadata.json 一起使用
2.在SpringMVC中校验常用DTO对入参对象校验,会涉及到@Validation(value=xxx.class) 用分组来对不同业务操作校验

@Validated @Valid区别

1.@Valid用户嵌套校验,其余如果不深究使用@Validated就可以了
2.Validated是org.springframework的annotation,@Valid 注解是javax.validation的注解.
3.@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制,@Valid:没有分组功能
4.@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field),@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上

ConfigurationProperties Validation

@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {

	@NotNull
	private InetAddress remoteAddress;

	// ... getters and setters

}

详情可查看@ConfigurationProperties Validation

Service Validation

@Service
@Validated
public class MyBean {

	public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code,
			Author author) {
		...
	}

}

详情可查看 @Service Validation

快速记忆使用方式

Bean类加@Validation,需要校验的对象前加@Validation,对象里的嵌套校验加@Valid

@Validated 原理

1.基于Spring Boot的AutoConfiguration: org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
2.创建MethodValidationPostProcessor的Bean对象

MethodValidationPostProcessor 源码分析

在这里插入图片描述
实现InitializingBean接口
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

由其中可看出仅对带有@Validated的Bean对象做PointCut处理

展开阅读全文

没有更多推荐了,返回首页