为什么我的Spring 3验证程序验证模型中的所有内容?
我有一个弹簧3控制器和一个验证器的方法之一。 它坚持验证模型上的每个对象。 任何人都可以向我解释为什么这样做,或者如果我做错了什么?
根据文档,5.7.4.3配置供Spring MVC使用的JSR-303 Validator(http://static.springsource.org/spring/docs/3.0.0.RC3/spring-framework-reference/html/ch05s07。 HTML)
通过JSR-303,单个javax.validation.Validator实例通常会验证声明验证约束的所有模型对象。 要使用Spring MVC配置JSR-303支持的Validator,只需将一个JSR-303提供程序(如Hibernate Validator)添加到您的类路径中即可。 Spring MVC将检测到它并自动启用跨所有控制器的JSR-303支持。
例:
@Controller
public class WhaleController {
@Autowired
private Validator myValidator;
@Autowired
private WhaleService whaleService;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(this.myValidator);
}
@RequestMapping(value="/save-the-whales")
@Transactional
public void saveTheWhales(@Valid WhaleFormData formData, BindingResult errors, Model model) {
if (!errors.hasFieldErrors()) {
Whale whale = new Whale();
whale.setBreed( formData.getBreed() );
this.whaleService.saveWhale( whale );
model.addAttribute("whale", whale);
}
model.addAttribute("errors", errors.getFieldErrors());
}
}
运行时,它会抱怨鲸鱼是myValidator的无效目标(它被设置为验证WhaleFormData,并且很好)。 鲸鱼是一个POJO,没有验证约束,注释和任何地方都没有配置。 通过试验和错误,我发现放置在模型上的ANY对象将尝试进行验证,如果验证程序未设置为处理它,则会失败。 原始人很好。
任何人都可以告诉我为什么会这样,请指出相应的文档和/或告诉我在模型上放置某些东西而不验证它的最佳方式?
在上面的例子中,我想将“鲸鱼”放在模型上,因为它现在将具有从持久层接收到的唯一的whaleId()。
谢谢!
我猜这个行为在文档中没有涉及到。
问题是由以下原因引起的:
默认情况下,为每个非基本模型属性(传入和@InitBinder
)调用@InitBinder
-annotated方法(为@InitBinder
属性调用它的目的是为了允许您注册自定义PropertyEditor
,在渲染时使用表单标记形成)。
DataBinder.setValidator()
包含一个调用Validator.supports()
的防御性检查,如果返回false
则会引发异常。 所以,没有尝试进行验证,只是一个早期检查。
解决方案是将@InitBinder
的范围限制为特定属性:
@InitBinder("whaleFormData")
protected void initBinder(WebDataBinder binder) { ... }
链接地址: http://www.djcxy.com/p/61089.html
上一篇: Why is my Spring 3 Validator Validating Everything on the Model?
下一篇: Cross field validation with Hibernate Validator (JSR 303)