OpenEJB - 为JUnit配置数据源

时间:2012-06-05 13:20:42

标签: java-ee persistence openejb

我在为OpenEJB 3.1.3正确配置数据源时遇到问题。我尝试配置连接到postgres db,但是我调试测试我得到默认的hsql连接参数。

这是我的测试类:

@RunWith(ApplicationComposer.class)
public class OpenEJBTest {
    @EJB
    Files fb;

    @Test
    public void testSth() {
        List<UploadSession> uploadNotFinishedSessions = fb.getUploadNotFinishedSessions();
    }

    @Module
    public EjbJar beans() {
        EjbJar ejbJar = new EjbJar("beans");
        ejbJar.addEnterpriseBean(new StatelessBean(FilesBean.class));
        ejbJar.addEnterpriseBean(new StatelessBean(FilesUtilBean.class));
        ejbJar.addEnterpriseBean(new StatelessBean(ServerFilesBean.class));
        ejbJar.addEnterpriseBean(new StatelessBean(UserUtilBean.class));
        return ejbJar;
    }

    @Module
    public PersistenceUnit persistence() {
        PersistenceUnit unit = new PersistenceUnit("postgresPU", HibernatePersistence.class.getName());
        String simpleXml = SimpleXmlUtil.toSimpleXml(unit);
        System.out.println(simpleXml);
        unit.setJtaDataSource("PostgresDS");
        unit.setNonJtaDataSource("PostgresDSUnmanaged");
        return unit;
    }
}

我试图:

  1. 将jndi.properties添加到classpath:
  2. postgresPU=new://Resource?type=DataSource
    postgresPU.JdbcDriver=org.postgresql.Driver
    postgresPU.JdbcUrl=jdbc:postgresql:/localhost:5433/pdb
    postgresPU.JtaManaged=true
    postgresPU.DefaultAutoCommit=false
    postgresPU.UserName=...
    
    1. 通过openejb.xml(位于类路径上)
    2. 配置数据源
      <Resource id="PostgresDS" type="DataSource">
        JdbcDriver  org.postgresql.Driver
        JdbcUrl   jdbc:postgresql://localhost:5433/pdb
        UserName   user
        Password  pass
        JtaManaged true
      </Resource>
      
       <Resource id="PostgresDSUnmanaged" type="DataSource">
           JdbcDriver  org.postgresql.Driver
          JdbcUrl     jdbc:postgresql://localhost:5433/pdb
           UserName    user
          Password    pass
        JtaManaged  false
       </Resource>
      

      但它都不起作用 - 数据源根本没有配置,数据源的默认版本仍然存在。 由于默认的hsql连接,我得到以下错误:

      WARN - SQL Error: -22, SQLState: S0002
      ERROR - Table not found in statement [select top ? user0_.id as col_0_0_ from tusers user0_ where user0_.login=?]
      

      我可能做错了什么?

1 个答案:

答案 0 :(得分:5)

ApplicationComposer不使用JNDI来引导容器,因此永远不会看到jndi.properties文件。

您可以做的是在方法上使用org.apache.openejb.junit.Configuration注释,让它返回您要用来配置测试的属性。

@Configuration
public Properties properties() {
   //...
}

我将jndi.properties重命名为其他内容以免混淆,然后您可以使用此类代码在类路径中找到它。

   final URL url = this.getClass().getResource("/config.properties");
   final Properties props = new Properties();
   final InputStream in = url.openStream();
   try {
       props.load(in);
   } finally {
       close(in);
   }