Grails数据源在服务中变为null
我使用的是Grails2.2.1,我在服务中注入了一个自定义数据源,以便执行一些SQL查询 在第一次执行时,有一个数据源,但在每次后续调用中,对该数据源的引用都变为nullGrails数据源在服务中变为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
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对您的问题的评论。