【SpringMVC】springmvc中的数据校验

本文探讨了SpringMVC如何利用校验框架进行数据校验,重点关注了javaBean类型的参数。在处理器方法执行前,参数由特定解析器进行校验,如ModelAttributeMethodProcessor和RequestResponseBodyMethodProcessor。当遇到@Valid或@Validated,会进行绑定结果校验。Spring通过AOP代理在所有参数解析后进行额外校验。文章还澄清了SpringMVC与SpringBoot的校验区别,指出SpringBoot仅做自动配置,实际校验工作由如Hibernate Validator等组件完成。
摘要由CSDN通过智能技术生成

在开始本篇分析之前,先来看两篇文章:
1,基础理论知识:求求你别在用 IF ELSE 校验参数了
2,演示示例:SpringMVC/Boot中的校验框架 @Valid 和 @Validated的使用

这里注意:springmvc中只是引用了校验框架,真正的校验功能,springmvc没有实现。真正干事的是校验框架,所以本篇是分析,springmvc是如何使用校验框架的。

在执行处理器方法之前,一定是要解析出方法的参数值。不同的参数由不同的参数解析器负责。什么样的才会用到校验呢?答案:javaBean类型的;涉及到了解析复杂参数的ModelAttributeMethodProcessor,和用来处理@requestBody的RequestResponseBodyMethodProcessor。


RequestResponseBodyMethodProcessor

	public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
   

		parameter = parameter.nestedIfOptional();
		// 解析出值
		Object arg = readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType());
		String name = Conventions.getVariableNameForParameter(parameter);

		if (binderFactory != null) {
   
			WebDataBinder binder = binderFactory.createBinder(webRequest, arg, name);
			if (arg != null) {
   
				// 进行校验
				validateIfApplicable(binder, parameter);
				// 如果校验有错误,并且这个参数的后面没有BindingResult类型的,那么就抛异常。
				if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
   
					throw new MethodArgumentNotValidException(parameter, binder.getBindingResult());
				}
			}
			// 把这个绑定结果方法哦model中,处理器BindingResult类型的参数解析器得到值。
			if (mavContainer != null) {
   
				mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult());
			}
		}

		return adaptArgumentIfNecessary(arg, parameter);
	}

校验解析出来的参数,如果这个参数后面跟的是BindingResult,那么特定的参数解析器会将绑定结果解出来;如果没有跟,那么如果校验出错误,抛异常MethodArgumentNotValidException。

这一步的作用就是将绑定结果放到model中,等待ErrorsMethodArgumentResolver处理器解析出参数。

if (mavContainer != null) {
   
				mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult());
			}

// org.springframework.web.method.annotation.ErrorsMethodArgumentResolver#resolveArgument
	public Object resolveArgument(MethodParameter parameter,
			@Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
			@Nullable WebDataBinderFactory binderFactory) throws Exception {
   

		
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值