0

我是 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 类 [org.springframework.web.servlet.ModelAndView] 的无效属性“callType”:bean 属性“callType”不是可读或具有无效的 getter 方法:getter 的返回类型是否与 setter 的参数类型匹配?例外。

对于属性 callType,它不是在 ReportsCommand 类中搜索,而是在 spring ModelAndView 类中搜索。可能是什么 pbm。谁能告诉我...

4

2 回答 2

1

如果您想使用注释进行验证,听起来您可能对使用@Valid.

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html#validation-beanvalidation-overview

于 2012-06-11T15:34:39.757 回答
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) {
       .....
      }
    }
于 2012-06-11T15:45:08.337 回答