3

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

在第一次执行时,有一个 dataSource,但在每次后续调用中,对 dataSource 的引用都变为 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 = "..."
    }
  }
}
4

4 回答 4

1

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

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

Grails 2 服务中的多个动态数据源

谢谢

于 2013-09-04T17:53:28.880 回答
1

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

于 2013-09-18T20:17:46.173 回答
1

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

于 2013-09-21T02:53:11.447 回答
1

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

于 2020-10-27T13:15:29.383 回答