【问题标题】:org.springframework.beans.factory.BeanCreationException: as well as org.springframework.beans.BeanInstantiationExceptionorg.springframework.beans.factory.BeanCreationException:以及 org.springframework.beans.BeanInstantiationException
【发布时间】:2012-11-18 12:51:15
【问题描述】:

我尝试在 spring 中进行登录和一些数据库操作(插入、删除)并帮助 jsp。我对 spring 完全陌生。我收到以下错误,如 bean 创建异常。我已将 dvd 定义为 servlet 名称在 web.xml 中。所以我的 dvd_servlet.xml 文件如下所示

<beans.................>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/DVD"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
</bean>

<bean name="DvdController" class="DvdController" >
    <property name="dataSource" ref="dataSource"/>
</bean>
<bean name="LoginController" class="LoginController" >
    <property name="dataSource" ref="dataSource"/>
</bean>
<bean name="AccountCreationController" class="AccountCreationController" >
    <property name="dataSource" ref="dataSource"/>
</bean>
</beans>

我的 LoginController 是这样的

public class LoginController implements Controller   {

     int check;
    private DataSource dataSource;
     public void setDataSource(DataSource dataSource) {
    this.dataSource=dataSource;
    }
    public DataSource getDataSource() {
    return dataSource;
    }

    JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
    @RequestMapping(value="/Login",method=RequestMethod.POST)
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {                       
                String userName = request.getParameter("userName");
            String password=request.getParameter("password");
            try {
            String selectQuery=("SELECT * FROM USERDETAILS WHERE NAME='"+userName+"'AND PASSWORD='"+password+"'");
                check=jdbcTemplate.update(selectQuery,new Object[]{});  
                System.out.println(check);
                if(check!=0) {
                response.sendRedirect("DvdController");

                }
            }

            catch(IOException e) {
            e.printStackTrace();            
            }

            return new ModelAndView("failure"); 
    }

我的错误如下:

org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源 [/WEB-INF/dvd-servlet.xml] 中定义的名称为“LoginController”的 bean 时出错:bean 的实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 bean 类 [LoginController]:构造函数抛出异常;嵌套异常是 java.lang.IllegalArgumentException: Property 'dataSource' is required org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(support:AbstractAutowireCapableBeanFactory.java):965) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(support:AbstractAutowireCapableBeanFactory.java):911) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(support:AbstractAutowireCapableBeanFactory.java):485) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(support:AbstractAutowireCapableBeanFactory.java):456) org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(support:AbstractBeanFactory.java):291) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(support:DefaultSingletonBeanRegistry.java):222) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(support:AbstractBeanFactory.java):288) org.springframework.beans.factory.support.AbstractBeanFactory.getBean(support:AbstractBeanFactory.java):190) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(support:DefaultListableBeanFactory.java):580) org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)

根本原因

org.springframework.beans.BeanInstantiationException:无法实例化bean类[LoginController]:构造函数抛出异常;嵌套异常是 java.lang.IllegalArgumentException: Property 'dataSource' is required org.springframework.beans.BeanUtils.instantiateClass(beans:BeanUtils.java):141) org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(support:SimpleInstantiationStrategy.java):74) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(support:AbstractAutowireCapableBeanFactory.java):958) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(support:AbstractAutowireCapableBeanFactory.java):911) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(support:AbstractAutowireCapableBeanFactory.java):485) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(support:AbstractAutowireCapableBeanFactory.java):456) org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(support:AbstractBeanFactory.java):291) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(support:DefaultSingletonBeanRegistry.java):222) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(support:AbstractBeanFactory.java):288) org.springframework.beans.factory.support.AbstractBeanFactory.getBean(support:AbstractBeanFactory.java):190) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(support:DefaultListableBeanFactory.java):580) org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)

根本原因

java.lang.IllegalArgumentException:需要属性“dataSource” org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSet(support:JdbcAccessor.java):134) org.springframework.jdbc.core.JdbcTemplate.(core:JdbcTemplate.java):164) LoginController.(LoginController.java:29) sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) java.lang.reflect.Constructor.newInstance(Constructor.java:513) org.springframework.beans.BeanUtils.instantiateClass(beans:BeanUtils.java):126) org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(support:SimpleInstantiationStrategy.java):74) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(support:AbstractAutowireCapableBeanFactory.java):958) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(support:AbstractAutowireCapableBeanFactory.java):911) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(support:AbstractAutowireCapableBeanFactory.java):485) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(support:AbstractAutowireCapableBeanFactory.java):456) org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(support:AbstractBeanFactory.java):291) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(support:DefaultSingletonBeanRegistry.java):222) org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(support:AbstractBeanFactory.java):288) org.springframework.beans.factory.support.AbstractBeanFactory.getBean(support:AbstractBeanFactory.java):190) org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(support:DefaultListableBeanFactory.java):580) org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)

请帮我解决这个问题!!!

【问题讨论】:

  • “dataSource”bean 声明在哪里?如果它声明在某处,则检查日志中是否有关于“数据源”bean 创建的异常。
  • 我已附上我的 LoginController 程序供您参考。查看并让我清除。
  • 如果你有一个 DataSource bean,这意味着还有另一个异常 - 向下滚动日志并检查它是否被截断。
  • 什么是 Controller 如果它是你的类,也许你已经在那里声明了一个 dataSource 属性并用 @Required 而不是 @Autowired 注释它
  • 谢谢 Boris Treukhov。对于这个概念有什么春季学习教程

标签: spring


【解决方案1】:

我在这里看到两个问题:

<bean name="LoginController" class="LoginController" >
    <property name="dataSource" ref="dataSource"/>
</bean>

LoginController 真的是完全限定的类名吗?它应该类似于 com.cy.LoginController

其次,Spring 声明 LoginController 的构造函数需要属性 dataSource。看起来 LoginController 需要数据源的构造函数注入,你正在做的是 setter 注入,所以试试这个:

代替&lt;property name="dataSource" ref="dataSource/&gt;,写: &lt;constructor-arg ref="dataSource"/&gt;

【讨论】:

  • 是的,我在 classes 文件夹下创建了 LoginController,所以我不需要任何包结构。我没有将 dataSource 定义为构造函数参数。它就像一个变量。我添加了有问题的 Logincontroller。请查看该程序并让我清除
  • 你也应该把Controller接口贴出来,这样我们可以看看有没有注解,正如Boris在上面评论中所说的那样。
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2017-01-07
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
相关资源
最近更新 更多