如何修复 Grails 应用程序中的 org.springframework.beans.factory.BeanCreationException 错误?

Posted

技术标签:

【中文标题】如何修复 Grails 应用程序中的 org.springframework.beans.factory.BeanCreationException 错误?【英文标题】:How do I fix the org.springframework.beans.factory.BeanCreationException error in my Grails application? 【发布时间】:2013-09-10 17:36:20 【问题描述】:

在绑定运行 grails 应用程序时,我收到一个巨大的错误列表。该应用程序运行良好,直到我将数据库从 mysql 迁移到 SQL Server。我使用了 SQL Server 迁移助手,那里一切正常。我还将 sqljdbc4.jar 添加到 lib 目录并更新了 DataSource.groovy 以使用 SQL Server。我已经尝试解决这个问题好几天了,非常感谢您的意见。我对 Grails、数据库、服务器等还很陌生,所以如果我没有适当地描述这个错误,我深表歉意。

感谢您的帮助!

版本:Grails 1.3.9、JDK 1.7.0_21、NetBeans IDE 7.3.1 和 Microsoft SQL Server 2008

这是我在运行 grails run-app 命令时遇到的错误:

     context.GrailsContextLoader Error executing bootstraps:

     Error creating bean with name 'messageSource': 
     Initialization of bean failed; nested exception is 
     org.springframework.beans.factory.BeanCreationException: 

     Error creating bean with name 'transactionManager': 
     Cannot resolve reference to bean 'sessionFactory' 
     while setting bean property'sessionFactory'; nested exception is 
     org.springframework.beans.factory.BeanCreationException: 

     Error creating bean with name 'sessionFactory': 
     Cannot resolve reference to bean 'hibernateProperties' 
     while setting bean property 'hibernateProperties'; nested exception is 
     org.springframework.beans.factory.BeanCreationException: 

     Error creating bean with name 'hibernateProperties': 
     Cannot resolve reference to bean 'dialectDetector' 
     while setting bean property 'properties' with key [hibernate.dialect]; nested exception is 
     org.springframework.beans.factory.BeanCreationException: 

     Error creating bean with name 'dialectDetector': 
     Invocation of init method failed; nested exception is          
     org.springframework.jdbc.support.MetaDataAccessException: 

     Error while extracting DatabaseMetaData; nested exception is 
     org.apache.commons.dbcp.SQLNestedException: 

     Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)
     org.springframework.beans.factory.BeanCreationException:

     Error creating bean with name 'messageSource': 
     Initialization of bean failed; nested exception is          
     org.springframework.beans.factory.BeanCreationException:

     Error creating bean with name 'transactionManager': 
     Cannot resolve reference to bean 'sessionFactory' 
     while setting bean property 'sessionFactory'; nested exception is 
     org.springframework.beans.factory.BeanCreationException: 

     Error creating bean with name 'sessionFactory': 
     Cannot resolve reference to bean 'hibernateProperties' 
     while setting bean property 'hibernateProperties'; nested exception is 
     org.springframework.beans.factory.BeanCreationException: 

     Error creating bean with name 'hibernateProperties': 
     Cannot resolve reference to bean 'dialectDetector' 
     while setting bean property 'properties' with key [hibernate.dialect]; nested exception is          
     org.springframework.beans.factory.BeanCreationException: 

     Error creating bean with name 'dialectDetector': 
     Invocation of init method failed; nested exception is 
     org.springframework.jdbc.support.MetaDataAccessException:


     Error while extracting DatabaseMetaData; nested exception is 
     org.apache.commons.dbcp.SQLNestedException:

     Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)
        at org.grails.tomcat.InlineExplodedTomcatServer.doStart(InlineExplodedTomcatServer.groovy:112)
        at org.grails.tomcat.InlineExplodedTomcatServer$doStart.callCurrent(Unknown Source)
        at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:97)
        at grails.web.container.EmbeddableServer$start.call(Unknown Source)
        at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158)
        at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy)
        at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280)
        at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
        at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149)
        at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy)
        at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116)
        at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy)
        at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59)
        at RunApp$_run_closure1.doCall(RunApp.groovy:33)
        at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
        at gant.Gant.withBuildListeners(Gant.groovy:427)
        at gant.Gant.this$2$withBuildListeners(Gant.groovy)
        at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
        at gant.Gant.dispatch(Gant.groovy:415)
        at gant.Gant.this$2$dispatch(Gant.groovy)
        at gant.Gant.invokeMethod(Gant.groovy)
        at gant.Gant.executeTargets(Gant.groovy:590)
        at gant.Gant.executeTargets(Gant.groovy:589)

    Caused by: org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'transactionManager': 
    Cannot resolve reference to bean 'sessionFactory' 
    while setting bean property 'sessionFactory'; nested exception is 
    org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'sessionFactory': 
    Cannot resolve reference to bean 'hibernateProperties' 
    while setting bean property 'hibernateProperties'; nested exception is 
    org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'hibernateProperties': 
    Cannot resolve reference to bean 'dialectDetector' 
    while setting bean property 'properties' with key [hibernate.dialect]; nested exception is 
    org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'dialectDetector': 
    Invocation of init method failed; nested exception is 
    org.springframework.jdbc.support.MetaDataAccessException: 

    Error while extracting DatabaseMetaData; nested exception is 
    org.apache.commons.dbcp.SQLNestedException: 

    Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)
        ... 25 more



    Caused by: org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'sessionFactory': 
    Cannot resolve reference to bean 'hibernateProperties' 
    while setting bean property 'hibernateProperties'; nested exception is 
    org.springframework.beans.factory.BeanCreationException:

    Error creating bean with name 'hibernateProperties': 
    Cannot resolve reference to bean 'dialectDetector' 
    while setting bean property 'properties' with key [hibernate.dialect]; nested 
    exception is org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'dialectDetector': 
    Invocation of init method failed; nested exception is 
    org.springframework.jdbc.support.MetaDataAccessException: 

    Error while extracting DatabaseMetaData; nested exception is         
    org.apache.commons.dbcp.SQLNestedException: 

    Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)
        ... 25 more



    Caused by: org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'hibernateProperties': 
    Cannot resolve reference to bean 'dialectDetector' 
    while setting bean property 'properties' with key [hibernate.dialect]; nested exception is 
    org.springframework.beans.factory.BeanCreationException: 

    Error creating bean with name 'dialectDetector': 
    Invocation of init method failed; nested exception is 
    org.springframework.jdbc.support.MetaDataAccessException: 

    Error while extracting DatabaseMetaData; nested exception is         
    org.apache.commons.dbcp.SQLNestedException: 

    Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)
        ... 25 more



    Caused by: org.springframework.beans.factory.BeanCreationException:

    Error creating bean with name 'dialectDetector': 
    Invocation of init method failed; nested exception is 
    org.springframework.jdbc.support.MetaDataAccessException:

    Error while extracting DatabaseMetaData; nested exception is 
    org.apache.commons.dbcp.SQLNestedException: 

    Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)
        ... 25 more


    Caused by: org.springframework.jdbc.support.MetaDataAccessException: 

    Error while extracting DatabaseMetaData; 
    nested exception is org.apache.commons.dbcp.SQLNestedException: 

    Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)
        ... 25 more


    Caused by: org.apache.commons.dbcp.SQLNestedException: 
    Cannot create PoolableConnectionFactory (Login failed for user 'dev'.)

        at  org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
        at com.sun.proxy.$Proxy10.getMetaData(Unknown Source)
        ... 25 more

    Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user 'dev'.

        at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197)
        at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:246)
        at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:83)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2529)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:1905)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:1893)
        at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4575)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1400)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1045)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
        at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
        at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
        at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
        at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
        ... 28 more

这是我的 DataSource.groovy 文件

    dataSource 
    pooled = true
    //driverClassName = "com.mysql.jdbc.Driver" (driver for mysql)
    driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver" 
    dialect = "org.hibernate.dialect.SQLServer2008Dialect" 
    username = "dev"
    password = "dev"
    properties 
        maxActive = 30
        maxIdle = 5
        validationQuery = "/* ping */"
        testWhileIdle = true
        timeBetweenEvictionRunsMillis = 10000
        minEvictableIdleTimeMillis = 120000
    


hibernate 
    cache.use_second_level_cache=true
    cache.use_query_cache=false
    cache.provider_class='net.sf.ehcache.hibernate.EhCacheProvider'

// environment specific settings
environments 
    development 
        dataSource 
            dbCreate = "update" // one of 'create', 'create-drop','update'
            //url = "jdbc:mysql://localhost/timesheet_development?autoReconnect=true"
            url = "jdbc:sqlserver://localhost:1433;instanceName=sqlexpress;databaseName=timesheet_development"
        
    
    test 
        dataSource 
            dbCreate = "update"
            //url = "jdbc:mysql://localhost/timesheet_test?autoReconnect=true"
            url = "jdbc:sqlserver://localhost:1433;instanceName=sqlexpress;databaseName=timesheet_test"
        
    
    production 
        dataSource 
            dbCreate = "update"
            //url = "jdbc:mysql://localhost/timesheet_production?autoReconnect=true"
            url = "jdbc:sqlserver://localhost:1433;instanceName=sqlexpress;databaseName=timesheet_update"
            username = "********"
            password = "********"           
        
    

【问题讨论】:

dev 是 SQL Server 实例的有效用户吗?另外,您是否尝试过使用validationQuery 来代替"select 1",例如:validationQuery = "select 1" "无法创建 PoolableConnectionFactory(用户 'dev' 登录失败。)" 我认为您对 dev 是有效用户的看法是正确的。我正在使用适当的用户重新迁移数据库,希望这会奏效。立即解决权限问题。 我现在已经成功启动了我的应用程序,但是现在我收到了 Grails 运行时异常错误“不支持从二进制到 BIT 的转换”。我认为这可能与我转换数据库时某些值未正确从 MySQL 转换为 SQL Server 有关。我最初的问题似乎已经解决了,所以感谢您为我指出正确的方向! 【参考方案1】:

在解决这个问题一整天并从 cmets 获得有价值的意见后,我找到了解决问题的方法。

1) Dev 不是 SQL Server 的有效用户,因此我将其添加到 phpMyAdmin 以及数据库的安全文件夹中。在将用户 dev 添加到 MySQL 后,我还重新迁移了数据库。

2) plugins.searchable=0.6.4 需要从 application.properties 文件中注释掉以修复堆栈跟踪错误。

3) Grails 运行时异常已通过检查数据库表并更正不正确迁移的数据类型来解决。所有二进制数据类型都必须更改为位类型。 Grails 应用程序现在可以完美运行。希望这可以帮助其他人解决这个问题!

【讨论】:

以上是关于如何修复 Grails 应用程序中的 org.springframework.beans.factory.BeanCreationException 错误?的主要内容,如果未能解决你的问题,请参考以下文章

热代码修复正在编译但未在 grails 2.4.4 中选择

Grails 布局没有改变

如何管理 Grails 中的对象修订?

如何从 grails 应用程序中的 sessionId 获取 HttpSession

在哪里放置,以及如何访问 Grails 应用程序中的 jQuery 插件?

如何访问 Grails 中的两个数据库