在Controller中将嵌套类作为ModelAttribute有什么问题?

时间:2017-03-18 11:39:42

标签: java spring spring-mvc

我正在处理一个从用户检索3个信息的简单表单(字符串名称,MultipartFile img,列表类型)。
但由于这些对象没有绑定到特定的bean,我在我的Controller中创建了一个名为 MyForm 的嵌套类(因为我不会在其他地方使用它),如下所示:

// this is inside a controller
public class MyForm {
    private String name;
    private MultipartFile img;
    private List<Type> types;

    public MyForm() {}

    public MyForm(String name, Multipart img, List<Type> types) {
         this.name = name;
         this.img = img;
         this.types = types
    }
}

我的控制器使用它的方法如下:

@RequestMapping(value = "/new", method = RequestMethod.POST)
public String saveSomeObject(@ModelAttribute("myForm") MyForm myForm,  ModelMap map,
                              BindingResult result){
    SomeObject c = new SomeObject();
    c.setName(myForm.getName());
    c.setTypes(myForm.getTypes());
    doSomethingWithTheImage(myForm.getImg());

   //...

问题的面孔是,当提交表单并调用saveSomeObject时,我收到一条错误No default constructor found; nested exception is java.lang.NoSuchMethodException: com.main.statisthira.controllers.MyController.MyForm.<init>()(虽然我确实有一个默认的构造函数,没有args)

然后我将MyForm类移到MyController类之外,一切正常。 所以我只是想知道它是否只是糟糕的设计或是否有其他原因导致该错误

1 个答案:

答案 0 :(得分:2)

至少你的内部类没有声明static(将保存对外部控制器实例的引用,另请参阅Nested Classes)。通过这种方式,您需要一个控制器实例来创建一个MVC框架无法完成的表单。将其声明为静态可以解决问题。