我正在使用Grails 2.2.1,并且我将一个自定义dataSource注入到服务中,以便我可以执行一些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 = "..."
}
}
}
答案 0 :(得分:1)
解决了避免2次后续调用服务的问题。在第一次从控制器调用之后,框架似乎使服务连接为空。
答案 1 :(得分:1)
James Kleeh的评论为我解决了这个问题 - grails clean
然后重启了应用。
答案 2 :(得分:0)
尝试使用resources.groovy方式。这也将为您提供环境基础数据源选项。
在下面给出的链接上解释得很好:
Grails 2 multiple dynamic datasources in services
由于
答案 3 :(得分:0)
我遇到了类似的问题,并已解决。首先,请确保您的服务类位于grails-app/services
文件夹中。其次,您需要确保使用注入机制而不是使用构造函数来获取服务类的对象。我的服务类位于正确的文件夹中,但是我试图在控制器中将服务类的实例创建为MyService.instance
,并且出现null dataSource / connection的问题。然后,我在控制器中尝试了def myService
而不是MyService.instance
,它开始工作了。希望这可以帮助。谢谢