为什么我的Spring Model没有填充适当的属性?

时间:2012-09-25 21:55:26

标签: spring model attributes controller

我正在使用Spring 3.1.0.RELEASE。出于某种原因,在我的控制器中,当我发布表单并在发生错误时返回原始屏幕时,模型属性不会像我通过GET方法调用页面时那样填充。在我的控制器中我有

@Controller
public class StandardsUploadController {

    …
    @RequestMapping(value = "/upload")
    public String getUploadForm(Model model) {
        model.addAttribute(new StandardsUploadItem());
        model.addAttribute("gradeList", gradeList);
        model.addAttribute("subjectList", subjectList);
        return "upload/index";
    }

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public ModelAndView processFile(final StandardsUploadItem uploadItem,
        final BindingResult result, 
        final HttpServletRequest request,
        final HttpServletResponse response) throws InvalidFormatException, CreateException, NamingException {

        stdsUploadValidator.validate(uploadItem, result);
        if (!result.hasErrors()) {
            try {
                …       
            } catch (IOException e) {
                LOG.error(e.getMessage(), e);
                e.printStackTrace();
            }
        }   // if

        return new ModelAndView("upload/index");
    }

我做错了什么,如何纠正?

1 个答案:

答案 0 :(得分:1)

当您从POST返回上传/索引视图时,它不会重新填充模型,因为填充模型的代码是在GET上完成的。

一个可能的选择是在Controller类中使用@ModelAttribute注释

例如,对于StandardsUploadItem,您将拥有一个类似于此的方法:

@ModelAttribute("uploadItem")
public StandardsUploadItem getStandardsUploadItem(){
    return new StandardsUploadItem();
}

然后,您可以从GET方法中删除以下行:

model.addAttribute(new StandardsUploadItem());

由于使用@ModelAttribute注释并返回对象的方法将自动放入ModelMap中,无论激活哪个Controller RequestMapping方法。

POST方法的方法签名将包含以下内容:

..., @ModelAttribute("uploadItem") StandardsUploadItem uploadItem, ...

您需要为模型中的其他属性(gradeList和subjectList)执行类似的操作,但由于您似乎不需要在POST上使用它们,因此可以执行类似向POST方法添加Model参数的操作签名,并在错误情况下返回ModelAndView之前重新填充该Model。