首页 > 解决方案 > 强制超类包含无参数构造函数

问题描述

关于 Spring 控制器;当包含构造函数时,还必须包含无参数构造函数,否则会发生“NoSuchBeanDefinitionException”。这个消息非常模糊,让我有些头疼。

我们目前有一个抽象控制器类,我们的大多数控制器都从该类扩展。似乎当我的控制器扩展了这个类(它有一个 1 arg 构造函数)时,突然我收到了“NoSuchBeanDefinitionException”。

我想通过强制任何扩展抽象控制器以包含无参数构造函数的人来帮助未来的开发人员(甚至未来的我自己)。这可能吗?

编辑,为清楚起见添加代码

这是大多数控制器扩展的类,它包括一些辅助方法:

public class AbstractController
{
     private String sessionName;
     // other attributes / final variables

     public AbstractController(String sessionName)
     {
         this.sessionName = sessionName;
     }

     public boolean isCommandInSession(HttpSession session)
     {
         return session.getAttribute(sessionName) != null;
     }

     // Other helper methods which include use of 'sessionName'
}

许多控制器之一的示例,可以正常工作。如果没有默认构造函数,或者仅覆盖 1 arg 构造函数,此控制器将失败并显示“NoSuchBeanDefinitionException”

@Controller
@SessionAttributes(SomeController.COMMAND)
@RequestMapping(SomeController.URL)
public class SomeController extends AbstractController
{
    private String command = "someUniqueSessionName";

    public SomeController()
    {
        super(COMMAND);
    }
}

标签: javaspring-mvcconstructorcontroller

解决方案


你应该重构如下:

public class AbstractController
{    
     public boolean isCommandInSession(HttpSession session)
     {
         return session.getAttribute(getSessionName()) != null;
     }

     abstract String getSessionName();
}

推荐阅读