【问题标题】:Grails datasource becoming null in ServiceGrails 数据源在服务中变为空
【发布时间】:2013-09-08 08:24:53
【问题描述】:

我使用的是 Grails 2.2.1,并且我有一个自定义数据源注入到服务中,以便我可以执行一些 SQL 查询。

第一次执行时,有一个数据源,但在随后的每次调用中,对数据源的引用都变为空。

class ReportService {
  def dataSource_myds

  Object[] reportRecords(int a) {
    String query = "SELECT ..."

    Object[] resultSet;

    Sql sql = new Sql(dataSource_myds)
    // ^ Here the NullPointerException is thrown
    // But it always works at the first execution

    sql.eachRow(query, [a]) {
      ...
      resultSet += result
    }
    return resultSet
  }
}

class ReportController {
  ReportService reportService

  def report = {
     ...
     Object[] resultSet1 = reportService.reportRecords(1)
     ...
     Object[] resultSet2 = reportService.reportRecords(2)
     // ^ java.lang.NullPointerException : Must specify a non-null Connection
     ...
  }
}

以前有没有人见过这种情况,如果有,我该如何避免这种情况?

这是我的 DataSource.groovy

environments {
  development {
    dataSource_myds {
      url = "jdbc:oracle:thin:@..."
      driverClassName = "oracle.jdbc.driver.OracleDriver"
      username = "..."
      password = "..."
    }
  }
}

【问题讨论】:

  • 尝试在sql.eachRow()方法之后调用sql.close()
  • ReportController 中的 ReportService reportService 应该是 def reportService 可能不会影响您的用例。
  • @AnujAneja 我不认为严格类型的字段有什么问题。
  • @micha:是的,你是对的!!!
  • 运行 grails clean 并重新启动您的应用程序。

标签: grails service null datasource


【解决方案1】:

尝试,也使用 resources.groovy 方式。这也将为您提供环境基础数据源的选项。

在下面给出的链接上解释得很好:

Grails 2 multiple dynamic datasources in services

谢谢

【讨论】:

    【解决方案2】:

    解决了避免对服务进行 2 次后续调用的问题。从控制器第一次调用后,框架似乎使服务连接无效。

    【讨论】:

    • 我有同样的问题 - 如果我理解你的注释,你只是通过不进行 2 次后续调用来解决它?所以真的不能解决原来的问题吗?我希望找到一个完整的解决方案。
    • 是的,这是一种解决方法;我没有找到完整的解决方案,我仍然不明白 Service 依赖注入在后续调用中是如何工作的。
    • 查看我在 9 月 21 日的回答和 James Kleeh 对您的问题的评论以获得完整的解决方案。
    【解决方案3】:

    James Kleeh 的评论为我解决了这个问题 - grails clean 然后重新启动应用程序。

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,我已经解决了。首先,确保您的 Service 类位于 grails-app/services 文件夹中。其次,您需要确保使用注入机制而不是使用构造函数获取服务类的对象。我在正确的文件夹中有我的服务类,但我试图在我的控制器中创建服务类的实例为MyService.instance 并且遇到空数据源/连接的问题。然后我在我的控制器中尝试了def myService 而不是MyService.instance,它成功了。希望这可以帮助。谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多