Grails数据源在服务中变为null

Grails数据源在服务中变为null,grails,service,null,datasource,Grails,Service,Null,Datasource,我使用的是Grails2.2.1,我在服务中注入了一个自定义数据源,以便执行一些SQL查询 在第一次执行时,有一个数据源,但在每次后续调用中,对该数据源的引用都变为null class ReportService { def dataSource_myds Object[] reportRecords(int a) { String query = "SELECT ..." Object[] resultSet; Sql sql = new Sql(data

我使用的是Grails2.2.1,我在服务中注入了一个自定义数据源,以便执行一些SQL查询

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

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 = "..."
    }
  }
}

试着使用resources.groovy方法。这还将为您提供环境基础数据源的选项

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


谢谢

解决了避免随后2次呼叫该服务的问题。在控制器第一次调用后,框架似乎会使服务连接无效。

詹姆斯·克莱赫的评论为我解决了这个问题-
grails clean
,然后重新启动应用程序。

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

尝试在
sql.eachRow()
方法之后调用
sql.close()
。ReportController中的ReportService ReportService应该是def ReportService,ReportService可能不会影响您的用例。@AnujAneja我认为严格类型字段没有任何问题。@micha:是的,您是对的!!!运行
grails clean
并重新启动你的应用程序。我也有同样的问题-如果我理解你的说明,你只是通过不做两次后续调用来解决它?那么,真的不是解决最初问题的办法吗?我希望找到一个完整的解决方案。是的,这是一个解决办法;我没有找到一个完整的解决方案,我仍然不明白服务依赖注入在后续调用中是如何工作的。有关完整的解决方案,请参阅我9月21日的回答和James Kleeh对您的问题的评论。