1

我的一个 Spring 控制器类中的一个方法,

@RequestMapping(value = "/products/{productId}/specifications", method = RequestMethod.GET)
public String setup(@PathVariable("productId") Integer pid, Model m) {
  //... 
  m.addAttribute(foo);  <-- error
  return "my-page";
}

在收到错误消息“模型对象不得为空”后,我更改了方法签名,如下所示: public ModelAndView setup(@PathVariable("productId") Integer pid) {

    //...
    ModelAndView mv = new ModelAndView("my-page");
    mv.addObject(foo);     <-- error

    return mv; 
}

我能够运行一次修改后的代码。但是我在 ModelAndView 上遇到了同样的错误。我使用 Spring MVC 已经很多年了。那是我第一次遇到这个问题。原因是什么?

我使用 Spring 4.0.6.RELEASE。

4

1 回答 1

0

尽管您没有提供显示foo引用指向的代码,但可以安全地假设它是一个空引用。

我查看了 Github 上的项目代码,很清楚这里发生了什么。

ModelAndView#addObject(Object)方法委托给ModelMap#addAttribute(Object)方法,该方法Object使用您的问题所询问的确切消息断言所提供的不为空。

ModelAndView方法:

public ModelAndView addObject(Object attributeValue) {
    getModelMap().addAttribute(attributeValue);
    return this;
}

ModelMap方法:

public ModelMap addAttribute(Object attributeValue) {
    Assert.notNull(attributeValue, "Model object must not be null");
    if (attributeValue instanceof Collection && ((Collection<?>) attributeValue).isEmpty()) {
        return this;
    }
    return addAttribute(Conventions.getVariableName(attributeValue), attributeValue);
}
于 2014-08-21T21:40:39.757 回答