我是Spring的新手我正在使用spring 3.0.5 RELEASE。我的要求是我想使用spring注释验证表单中的字段。我用来执行此操作的代码如下。 这是实现验证器接口的验证器类。
public class FluctuationValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return ReportsCommand.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object command, Errors errors) {
ReportsCommand reportsCommand = (ReportsCommand) command;
System.out.println("Inside the validate method of validator class");
ValidationUtils.rejectIfEmpty(errors, "callType", "PackageNameIsRequired");
}
}
这里ReportsCommand是在表单中输入数据的类。 在控制器中,代码如下所示。
@Autowired
FluctuationValidator fluctuationValidator;
public ModelAndView showForm(@ModelAttribute("reports") ReportsCommand model, ModelAndView modelAndView,BindingResult result,
HttpServletRequest request, HttpServletResponse response) throws Exception {
fluctuationValidator.validate(modelAndView,result);
if (result.hasErrors()) {
modelAndView = new ModelAndView("report-generate-form");
return modelAndView;
}
}
在我正在使用的jsp文件中
<form:errors path="callType" cssClass="error" />
我的代码中有任何问题。如果我这样使用,我会得到 org.springframework.beans.NotReadablePropertyException:bean类的无效属性'callType'[org.springframework.web.servlet.ModelAndView]:Bean属性'callType'不可读或具有无效的getter方法:getter的返回类型匹配setter的参数类型?异常。
对于属性callType,它不是在ReportsCommand类中搜索而是在Spring的ModelAndView类中搜索。可能是什么pbm。任何人都可以告诉我......
答案 0 :(得分:1)
如果您想使用注释进行验证,您可能会对使用@Valid
的JSR-303验证感兴趣。
答案 1 :(得分:1)
而不是
fluctuationValidator.validate(modelAndView,result);
你需要
fluctuationValidator.validate(model,result);
模型是ReportsCommand对象
如果我理解正确,您要验证的实际对象是ReportsCommand对象。
您可以让控制器使用@Valid注释验证您的bean,并通过重写initBinder方法来设置验证器。见下面的样本
@Controller
public class MyController{
@Autowired
private MyValidator myValidator;
@Override
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(myValidator);
}
@Override
@RequestMapping(method = RequestMethod.POST)
public String create(@ModelAttribute("myBean") @Valid MyBean myBean,
BindingResult bindingResult,
Model uiModel) {
.....
}
}