Spring 2.5表单验证 - 如果调用验证器,动态数据会丢失?

时间:2009-10-30 21:25:04

标签: java spring validation

我有一个简单的表单,其中包含一个由数据库填充的选择框。触发验证时,选择框为空。我刚开始春天,我似乎错过了一些东西。

感谢任何帮助?提前谢谢。

在下面的控制器中,网站是动态内容。

@RequestMapping("/registration/registration.html")
public ModelMap setupRegistrationForm(HttpServletRequest request, RegistrationForm form) {
    ModelMap map = new ModelMap();
    I18NSite[] sites = new Sites().getSites();
    map.put("sites", sites);
    return map;
}

@RequestMapping(value="/registration/registration.html", method = RequestMethod.POST)
public String saveRegistrationForm(HttpServletRequest request,RegistrationForm form, BindingResult errors) {
    I18NSite site = Sites.getSite(); 
    RegistrationFormValidator validator = new RegistrationFormValidator();
    validator.setDataSource(site.getDataSource());
    validator.validate(form,errors);

    if (errors.hasErrors()) {
        return "registration/registration";
    } else {
        // other code
    }

    return "redirect:/index.html";
}

1 个答案:

答案 0 :(得分:1)

不确定这是否有帮助,但是您是否尝试使用@ModelAttribute注释公开您的参考数据,以便构建您的选择框的数据?这应该与此代码段类似:

@ModelAttribute("countries")
public List getAllCountries() {
    return geoService.getAllCountries();
}

或者在你的情况下:

@ModelAttribute("sites")
public List getSites() {
    I18NSite[] sites = new Sites().getSites();
    return Arrays.asList(sites);
}

这也是一个非常重要的问题,花了我很长时间才弄明白:

请记住,你的'支持豆',你的注册形式的表格字段中的pojo应该存在更长时间!而不仅仅是一个请求的持续时间。它,这意味着永远!应该存在相同的实例,直到调用另一个Spring mvc控制器。因此,RegistrationForm实例不仅存在于from设置和显示之后 - 当提交POST请求时,它应该仍然存在,并且Spring会使用表单数据填充RegistrationForm实例。您可以通过以下类级别注释来实现此目的:

// Example for your case... 
@Controller
@SessionAttributes("registrationForm")
public class RegistrationController {
   ...
}

I was googling around for this one for days (REALLY!) - so I really recommend to read this blog entry I found sometime ago. It helped me out of all that Spring MVC documentation hell ;-)

希望这会有所帮助; - )