0

InitializingBean と DisposableBean を実装するサービスがあります

class MyService implements InitializingBean, DisposableBean {

    static transactional = false

    def grailsApplication

    @Override
    void afterPropertiesSet() {
        System.setProperty("JMS_TIMEOUT", grailsApplication.config.JMS_TIMEOUT);
        // code performing a JDNI lookup
    }
}
enter code here

システム プロパティは、サービス内の他のコンポーネントを初期化するために使用されます。Config.groovy に構成を追加しました。

grails.config.locations = [ "file:${basedir}/grails-app/conf/myconfig.properties" ]

これは、アプリケーションの実行時に正常に機能します。ただし、サービスを注入するテスト/統合で統合テストを作成しています。

class MyServiceIntegrationTests  extends GrailsUnitTestCase {

   def myService

   void testMyService() {

   }
}

テストを実行すると、次の根本原因で StackTrace が得られます。

Caused by: javax.naming.NameNotFoundException: Name [ConnectionFactory] not bound; 0 bindings: []
at javax.naming.InitialContext.lookup(InitialContext.java:354)
at com.ubs.ecredit.common.jmsclient.DefaultConnector.<init>(DefaultConnector.java:36)

構成をロードできなかったか、統合テストで異なっているようです。サービスがインスタンス化される前に、これらのプロパティが統合テストにも設定されるように、構成またはコードを変更する方法はありますか?

更新: 原因は構成ではなく、JDNI ルックアップと Grails のバグであることが判明しました。参照: http://jira.grails.org/browse/GRAILS-5726

4

2 に答える 2

1

${basedir}さまざまな環境でさまざまなパスを取得します。PropertiesLoaderUtils.loadProperties別の方法として、カスタマイズした構成をロードするために使用できます。

import org.springframework.core.io.support.PropertiesLoaderUtils
import org.springframework.core.io.ClassPathResource
....
void afterPropertiesSet() {
    def configProperties = PropertiesLoaderUtils.loadProperties(
                   new ClassPathResource("myconfig.properties"))
    System.setProperty("JMS_TIMEOUT", configProperties.getProperty("JMS_TIMEOUT"))
    ....
}
于 2013-01-10T03:23:37.027 に答える
0

原因はライブラリ メソッドで使用される JNDI ルックアップであることが判明しました。サービスの afterPropertiesSet() には表示されていませんが、これは StackTrace で確認できます。

いくつかの調査を行った後、これは Grails のバグであることがわかりました: http://jira.grails.org/browse/GRAILS-5726

上記の回避策を追加すると、今のところ問題は解決しました。

于 2013-01-16T14:35:20.873 に答える