1

Spring Roo を使用して多数の Hibernate オブジェクトを生成しています。同じプロジェクトの単体テスト内で、次のようにすれば、データベースに正常に読み書きできます。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext.xml"})
public class SomeTest extends AbstractJUnit4SpringContextTests {

@Test
public void someTest() throws Exception {
    MyUser myUser = MyUsers.findByUserId(123);
    System.out.println(myUser.getFirstName());
}
....

ここで、mvn クリーン インストール パッケージを実行し、外部プロジェクトに jar を含めて、同じコードを実行すると、次のようになります。

MyUser myUser = MyUsers.findByUserId(123);
System.out.println(myUser.getFirstName());

「エンティティマネージャーが注入されていません (Spring Aspects JAR は AJC/AJDT アスペクトライブラリとして構成されていますか?)」というメッセージが表示されます。

このように Spring-Roo-Hibernate プロジェクト内にクラスを作成し、その上に ContextConfiguration を追加しようとしました。

@Service
@ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext.xml"})
public class SomeClassImpl {

    public MyUser doSomething(){

        MyUser myUser = MyUsers.findByUserId(123);
                return myUser;

    }

}

外部プロジェクトで doSomething() を呼び出すと、次のようになります。

public class TestDatabase {
    public static void main(String[] args){

        SomeClassImpl k = new SomeClassImpl();
        k.doSomething();
    }   
}

... 同じエラーが表示されます。

生成された AspectJ コードを見ると、次のようになります。

privileged aspect MyUser_Roo_Jpa_ActiveRecord {

    @PersistenceContext
    transient EntityManager MyUser.entityManager;

    public static final EntityManager MyUser.entityManager() {
        EntityManager em = new MyUser().entityManager;
        if (em == null) throw new IllegalStateException("Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)");
        return em;
    }

... @PersistenceContext が MyUser.entityManager() を初期化すると想定されていることがわかりますが、プロジェクトが jar されて外部プロジェクトに含まれている場合はそうではありません。entityManager を手動で初期化するにはどうすればよいでしょうか? または、entityManager を初期化する組み込みライブラリとして使用しているときに、Spring プロジェクトでコンテキストを初期化する別の方法はありますか?

4

1 に答える 1