Jos*_*son 31 validation spring spring-mvc
我有一个带有验证器的spring 3控制器,用于其中一种方法.它坚持验证模型上的每个对象.有人能够向我解释为什么会这样做或者我做错了什么?
根据文档,5.7.4.3配置一个JSR-303验证器供Spring MVC使用(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 Provider(如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());
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时,它会抱怨Whale是myValidator的无效目标(设置为验证WhaleFormData,并且确实如此).鲸鱼是一种POJO,没有验证限制,注释和任何地方都没有配置.通过反复试验,我发现放置在模型上的任何对象都将尝试验证,如果验证器未设置为处理它,则会失败.基元很好.
任何人都可以告诉我为什么这样,请指出适当的文档和/或告诉我在没有验证的情况下将某些东西放在模型上的最佳方法?
在上面的例子中,我想在模型上放置"whale",因为它现在将具有从我的持久层接收的唯一whaleId().
谢谢!
axt*_*avt 53
我想这个行为不在文档中.
问题是由以下原因引起的:
默认情况下,@InitBinder为每个非原始模型属性调用-annotated方法,包括传入和传出(调用它用于输出属性的目的是允许您注册自定义PropertyEditors,在呈现表单时由表单标记使用).
DataBinder.setValidator()包含一个防御性检查,Validator.supports()如果false返回则调用并抛出异常.因此,没有尝试进行验证,只是提前检查.
解决方案是将范围限制@InitBinder为特定属性:
@InitBinder("whaleFormData")
protected void initBinder(WebDataBinder binder) { ... }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9759 次 |
| 最近记录: |