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 clean install package 并将 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();
    }   
}

...我收到同样的错误:“实体管理器尚未注入(Spring Aspects JAR 是否配置为 AJC/AJDT 方面库?)”

查看生成的 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() 当项目被 jarred 并包含在外部项目中时它不是。如何手动初始化 entityManager ?还是有另一种方法来初始化spring项目中的上下文,当它将它用作将初始化entityManager的包含库时?

4

1 回答 1

1

因为应用程序上下文不知道模型。您正在从 appcontext 中创建模型。如果您使用 getBean("MyUser"); 获取模型 类似的事情会起作用。否则自动连接模型并将该模型用于您的 crud 操作。

您可以在 MyUser 中看到以下代码 - @PersistenceContext rotected transient EntityManager entityManager; 然后只有 entityManager 对象会在 Myuser 中初始化。

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

       @Autowired
       MyUser myUser; // use this object for ur crud operations 

       @Test
       public void someTest() throws Exception {                
           MyUser otherObject= myUser.findByUserId(123);
           System.out.println(otherObject.getFirstName());
       }
    }
于 2013-08-29T14:24:35.770 回答