具有引用名称的Spring Mvc ModelAttribute不起作用?

时间:2014-06-04 07:50:59

标签: spring model controller

我想在同一个Controller中创建不同的@Entity个实体。

@RequestMapping(value="create", method=RequestMethod.GET)
public String  GET(Model model) throws InstantiationException, IllegalAccessException
{
    Class<?> clazz = ????; // a Random POJO is chosen, i want to use POJOs!!

    Object object = clazz.newInstance();
    model.addAttribute("object", object);
    return "create";        
}

@RequestMapping(value="create", method=RequestMethod.POST)
public @ResponseBody Object POST(@ModelAttribute(value="object") Object object)
{
    System.out.println("POST! got type: " + object.getClass().getName());
    return object;
}

在Post方法中,我为@ModelAttribute(value="object") Object object

获取NULL

如果我将其更改为@ModelAttribute(value="object") realType object,它的效果非常好。但我还不知道这种类型。

我认为@ModelAttribute无论如何都可以用“对象”来实现这一点,但显然不是。我错过了什么?

1 个答案:

答案 0 :(得分:0)

提交时没有名为object的实际模型对象,spring根据参数类型构造它,并相应地绑定属性。

你有两个选择让它发挥作用

  1. 将对象存储在会话中
  2. 使用@ModelAttribute带注释的方法
  3. 如果这些都不存在,spring只会查看method参数并使用reflection来构造该类的实例。因此,在您的情况下,它只会是Object,然后绑定将失败。

    在会话中存储对象

    @Controller
    @SessionAttributes("object")
    public class MyController { ... }
    

    确保在完成后,在setComplete()对象上调用SessionStatus方法。

    使用@ModelAttribute带注释的方法

    不是在请求处理方法中创建和添加对象,而是为它创建一个特定的方法。

    @ModelAttribute("object")
    public Object formBackingObject() {
        Class<?> clazz = ????; // a Random POJO is chosen, i want to use POJOs!!
    
        Object object = clazz.newInstance();
        return object;
    }
    

    将在每个请求处理方法之前调用此方法,以便构造将用于绑定的新鲜对象。