当基于spring3注释的控制器中的表单验证失败时,参考数据将丢失

时间:2010-09-16 19:48:54

标签: java spring annotations controller

我正在做基于Spring 3注释的控制器事情。问题是,当验证失败时,参考数据会丢失,即countryDivisions的东西。我没有把它放在表单中,因为它不是用户可编辑的数据,这里的正统观点是只有用户可编辑的数据才会出现在表单中。我还有其他选择吗?

@Controller
public class MyInfoController {

   @Autowired
    private MyInfoFormValidator validator;

 private void loadReferenceData(ModelMap model) {
        model.put("countryDivisions",countryDivisionService.getCountryDivisionOrderedByCode());
    }

  @ModelAttribute
    private MyInfoForm loadMyInfo() {
        MyInfoForm form = new MyInfoForm();
     //load it up
    return form;
    }


    @RequestMapping(value="/editMyInfo", method = RequestMethod.GET)
    public String editMyInfo(ModelMap model ) {
        loadReferenceData(model);
        return "contactEdit";
    }

  @RequestMapping(value="/editMyInfo", method = RequestMethod.POST)
    public String saveMyInfo(ModelMap model, MyInfoForm form,BindingResult result ) {
        validator.validate (form,result);
        if (result.hasErrors()) {
            model.put("commandName", "myInfoForm");
            return "contactEdit";
        }
         //save some stuff
        return "redirect:viewMyInfo";
    }

}

2 个答案:

答案 0 :(得分:9)

您应该在注释@ModelAttribute的帮助下提供类似CountryDivisions的参考数据。这样做的好处是,您无需反复重复,并在多种方法中提供相同的数据。

对于你的例子,我会提供这样的东西:

@ModelAttribute("countryDivisions")
public List<CountryDivision> populateCountryDivisions() {
    return countryDivisionService.getCountryDivisionOrderedByCode();
}

这使您的视图可以访问名为“countryDivisions”的模型属性,该属性包含服务方法从“countryDivisionService”提供的“CountryDivison”对象列表。

答案 1 :(得分:1)

为什么不做呢

    if (result.hasErrors()) {
        model.put("commandName", "myInfoForm");
        loadReferenceData(model);
        return "contactEdit";
    }