You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
直接打断点,发现根本没进入这段代码,因此猜测是验证的时候报了异常,因此将@Length的max改成20,产生错误结果,然后进入org.hibernate.validator.internal.constraintvalidators.hv.LengthValidator,在isValid方法上右键Add to watches,打个断点(友情提示,本人用的IDEA-16),一步一步跟踪调试发现进入了下面这段关键的代码段:
publicclassModelAttributeMethodProcessorimplementsHandlerMethodArgumentResolver, HandlerMethodReturnValueHandler {
publicfinalObjectresolveArgument(MethodParameterparameter, ModelAndViewContainermavContainer,
NativeWebRequestwebRequest, WebDataBinderFactorybinderFactory) throwsException {
Stringname = ModelFactory.getNameForParameter(parameter);
Objectattribute = (mavContainer.containsAttribute(name) ?
mavContainer.getModel().get(name) : createAttribute(name, parameter, binderFactory, webRequest));
WebDataBinderbinder = binderFactory.createBinder(webRequest, attribute, name);
if (binder.getTarget() != null) {
bindRequestParameters(binder, webRequest);
validateIfApplicable(binder, parameter);
if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
thrownewBindException(binder.getBindingResult());
}
}
// Add resolved attribute and BindingResult at the end of the modelMap<String, Object> bindingResultModel = binder.getBindingResult().getModel();
mavContainer.removeAttributes(bindingResultModel);
mavContainer.addAllAttributes(bindingResultModel);
returnbinder.convertIfNecessary(binder.getTarget(), parameter.getParameterType(), parameter);
}
}
问题
今天遇到一个小问题,在进行表单提交之后,直接进入了400错误页面,这个比较诡异,我所做的无非就是进行了简单的参数验证,提取BindingResult中的信息放到Model中方便前台显示,如下:
解决过程
直接打断点,发现根本没进入这段代码,因此猜测是验证的时候报了异常,因此将
@Length
的max
改成20,产生错误结果,然后进入org.hibernate.validator.internal.constraintvalidators.hv.LengthValidator
,在isValid
方法上右键Add to watches,打个断点(友情提示,本人用的IDEA-16),一步一步跟踪调试发现进入了下面这段关键的代码段:就是在这个地方抛出了一个
BindException
的异常,然后Spring进行了其他一些处理进去了400页面,不重要,我们看看这个判断条件,hasErrors()是用来判断是否有参数验证错误,这里很明显为true,下面还有个关键方法,我们进去一探究竟:这里一看就明晰了,getParameterIndex()获取的就是
@Valid
标注的方法参数索引,然会去判断紧跟其后的参数是否为Errors
的子类,这时候我想到上面那个publish方法,我将Model作为其后续参数,而BindingResult为最后一个,因此肯定会返回true,导致抛出BindException异常。总结
The text was updated successfully, but these errors were encountered: