Spring MVC验证器Validator

	<!-- JSR303 Validator定义 -->
	<bean id="validator"
		class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
</beans>

如果想要开启Spring Framework的检验功能,需要定义一个验证器Bean —>LocalValidatorFactoryBean
@Bean
public Validator getValidator()
{
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.setValidationMessageSource(this.messageSource());//支持国际化的错误信息
validator.setProviderClass(HibernateValidator.class);//指定验证器实现的提供方
return validator;
}

JSR和Hibernate validator的校验只能对Object的属性(也就是Bean的域)进行校验,不能对单个的参数进行校验。
spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor()
{
MethodValidationPostProcessor processor =
new MethodValidationPostProcessor();
processor.setValidator(this.localValidatorFactoryBean());
return processor;
}

在Springboot中会自动导入这两个Bean,除非需要对Bean做定制,否则不需要显示的定义这两个Bean。
验证POJO
被验证的实体类
public class Foo {

@NotBlank
private String name;

@Min(18)
private Integer age;

@Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码格式错误")
@NotBlank(message = "手机号码不能为空")
private String phone;

@Email(message = "邮箱格式错误")
private String email;

//... getter setter

}

验证数据
public void myMethod1(@Validated Foo foo,BindingResult bingingResult)
{
if(bingingResult.hasErrors)
{
for(FieldError fieldError : bingingResult.getFieldErrors)
{

}
}
}

被@Validated注解的对象为待验证的对象,BindingResult为验证后存放的信息。每个Validated对应一个bindingResult
BingdingResult会被spring的验证器自动填充,如果有错误,bingingResult.hasErrors的返回值会是true
基于方法进行校验
在类前加上@Validated,在方法前加上需要验证的注解–>对函数返回值进行校验,在方法的传入参数上加上需要验证的注解—>对函数传参进行校验。
可以在传入参数中加入BindingResult,捕获校验的结果。
也可以定义异常处理方法,捕获验证未通过抛出的异常
@RestController
@Validated
public class BarController {

@RequestMapping("/bar")
public @NotBlank String bar(@Min(18) Integer age) {
    System.out.println("age : " + age);
    return "";
}

@ExceptionHandler(ConstraintViolationException.class)
public Map handleConstraintViolationException(ConstraintViolationException cve){
    Set<ConstraintViolation<?>> cves = cve.getConstraintViolations();
    for (ConstraintViolation<?> constraintViolation : cves) {
        System.out.println(constraintViolation.getMessage());
    }
    Map map = new HashMap();
    map.put("errorCode",500);
    return map;
}

}

编写自己的校验类型
编写自定义的校验注解
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {xxx.class})
@Pattern(regexp = “^[a-z0-9!#$%^&*'{}?/+=|_~-]+(\\.[a-z0-9!# &quot;   − ] + ) ∗ @ ( [ a − z 0 − 9 ] ( [ a − z 0 − 9 − ] ∗ [ a − z 0 − 9 ] ) ? ) + ( . [ a − z 0 − 9 ] &quot; + &quot; ( [ a − z 0 − 9 − ] ∗ [ a − z 0 − 9 ] ) ? ) ∗ %^&amp;*&#x27;{}?/+=|&quot; + &quot;_~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?)+(\\.[a-z0-9]&quot; + &quot;([a-z0-9-]*[a-z0-9])?)* " ]+)@([az09]([az09][az09])?)+(.[az09]"+"([az09][az09])?)”, flags = {Pattern.Flag.CASE_INSENSITIVE})
@ReportAsSingleViolation
public @interface Email
{
String message() default “”;

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
static @interface List {
    Email[] value();
}

}

@Constraint注解是定义校验注解必备的注解,其中属性validatedBy中可以填写指定的检验器类型,@Pattern是继承的其他注解,@ReportAsSingleViolation表示这个注解会和@pattern注解组合在一起,只引发一次错误。
有时候,需要自定义校验器校验指定类型的注解,则需要编写自己的校验器。编写自己的校验器需要实现标准的校验器接口ConstraintValidator。第一个泛型是校验注解,第二个泛型是需要校验的类型。
public class xxx.class implements ConstraintValidator<Email,CharSequence>
{
public void initialize(NotBlank annotation){…}
public boolean isValid(CharSequence value, ConstraintValidatorContext context){…}
}

附:
@Null:限制只能为null
@NotNull:限制必须不能为空
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值得数字
@DecimalMax(value)限制必须为一个不小于指定值得数字
@Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分不能超过fraction
@Futrue 限制必须为一个将来的日期
@Max(value) 限制必须为一个不大于指定值得数字
@Min(value)限制必须为一个不小于指定值得数字
@Past限制必须为一个过去的时间
@Pattern(value)限制为符合指定的正则表达式
@Size(max,min)限制字符长度在min 到 max 之间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 是一种基于 Java 的开发框架,用于构建 Web 应用程序。它是 Spring 框架的一部分,提供了一种模型-视图-控制MVC)的架构模式,帮助开发人员将应用程序的不同方面进行解耦。 在 Spring MVC 中,应用程序的请求由 DispatcherServlet 接收并将其路由到适当的处理程序(也称为控制)。控制处理请求并生成模型数据,然后选择适当的视图来呈现这些模型数据给用户。 以下是 Spring MVC 的一些重要组件和概念: 1. DispatcherServlet:是整个 Spring MVC 的中央调度,负责接收请求并将其分派给相应的处理程序。 2. 控制(Controller):处理请求的组件,根据请求的类型和内容执行逻辑处理,并生成模型数据。 3. 模型(Model):表示应用程序的数据和状态。控制可以通过模型对象来设置和获取数据,并将其传递给视图进行呈现。 4. 视图(View):负责将模型数据呈现给用户。可以是 JSP、Thymeleaf 或其他模板引擎。 5. 处理映射(Handler Mapping):将请求映射到相应的处理程序(控制)。它根据配置文件或注解来确定请求与处理程序之间的映射关系。 6. 视图解析(View Resolver):根据视图名称解析出实际的视图对象,它将逻辑视图名转换为物理视图。 7. 拦截(Interceptor):在请求处理的过程中,可以对请求进行预处理和后处理。可以用于身份验证、日志记录等功能。 8. 数据绑定(Data Binding):自动将请求参数绑定到控制方法的参数或模型对象的属性上。 9. 校验Validator):用于验证模型对象的数据的有效性。 Spring MVC 提供了灵活且强大的功能,使开发人员能够轻松构建可扩展和可维护的 Web 应用程序。它还支持 RESTful Web 服务和国际化等功能。通过良好的设计和组织,Spring MVC 可以实现松耦合、可测试和可扩展的应用程序架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值