Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法。 在这篇文章中,我们将看到如何使用此功能。
设定
首先,我们需要通过创建MethodValidationPostProcessor bean添加对方法参数验证的支持:
@Configuration public class MyConfiguration { @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } }
验证方法参数
注册MethodValidationPostProcessor之后,我们可以通过添加@Validated批注来启用每个bean的方法参数验证。 现在,我们可以将Java Bean验证批注添加到方法参数中以执行验证。
@Service @Validated public class UserService { public User getUser( @NotBlank String uuid) { ... } }
在这里,我们添加了@NotBlank批注,以确保传递的uuid参数不为null或为空字符串。 每当传递无效的uuid时,都会引发ContraintViolationException。
除了简单的参数验证之外,我们还可以验证带有JSR 303注释的对象。
例如:
public class User { @NotBlank private String name; // getter + setter }
@Service @Validated public class UserService { public void createUser( @Valid User user) { ... } }
通过添加@Valid(不是@Validated),我们将用户参数标记为验证。 然后将根据User类中定义的验证约束来验证传递的用户对象。 在此,名称字段不应为null或包含空字符串。
这是如何运作的?
我们注册的MethodValidationPostProcessor Bean是一个BeanPostProcessor,它检查每个Bean是否被@Validated注释。 如果是这样,它将添加一个AOP拦截器( MethodValidationInterceptor )来拦截方法调用并执行验证。 仅当验证成功时才调用实际的bean方法。
因为此功能依赖于AOP拦截器,所以它仅适用于spring bean。
与往常一样,您可以在GitHub上找到所示示例的源。
翻译自: https://www.javacodegeeks.com/2020/01/method-parameter-validation-with-spring-and-jsr-303.html