当前位置: 首页 > 知识库问答 >
问题:

CDI在使用TomEE(或开放EJB),码头和硒进行功能测试的设置中的问题

宋勇
2023-03-14

我正在尝试以编程方式设置一个带有 Jetty、OpenEJB 和 WebApps 的环境,以开发和运行硒测试。本文中描述的非常相似的内容:http://tomee.apache.org/functional-testing-with-openejb,-jetty-and-selenium.html。

这个设置非常好,因为我可以通过IDE或Maven启动硒测试,并使用相同的代码启动服务器进行开发。

我看到这个设置使用旧版本的Jetty (6.2)和EJB 3.0中一个未知的EJB容器(称为MyContainer)工作。现在我正在做(或试图做)...)在一个更新的项目中也是如此,该项目将在Wildfly 10.1.0中运行,并通过CDI (BeanManager)进行EJB查找。

但是我在新版本的Jetty和OpenEJB或TomEE中很难让CDI正常工作。我在互联网上找不到新版本框架的同样的事情的其他例子。我甚至不知道我是否真的需要Jetty来做这件事。

使用OpenEJB 4.7.4和Jetty 9.4,当我运行代码CDI.current(). getBeanManager()结果:

java.lang.IllegalStateException: Unable to access CDI

persistence.xml:

<property name="tomee.jpa.cdi" value="false" />

对象:豆子。xml文件在所有尝试中都位于我的webapp的WEB-INF目录中。

使用TomEE 7.0.3和Jetty 9.4,我只能让CDI在maven依赖中将OpenEJB更改为TomEE(奇怪!据说OpenEJB支持CDI)。当我在服务器设置中调试时,这个CDI可以工作,但是当程序访问webapp时,在我尝试进行EJB查找时出现错误:

"On a thread without an initialized context nor a classloader mapping a deployed app"

EJB容器启动,但Jetty服务器无法启动,因为找不到java: comp/env/

javax.naming.NameNotFoundException: Name "comp/env" not found

添加的代码:

Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
                    "org.eclipse.jetty.plus.webapp.EnvConfiguration",
                    "org.eclipse.jetty.plus.webapp.PlusConfiguration");

更改persistence.xml中的属性:

<property name="tomee.jpa.factory.lazy" value="true" />

EJB容器启动并CDI.current()存在,但是当我尝试使用代码执行一些SQL时:

@PersistenceContext(unitName="my-pu")
private EntityManager em;

//method
Session session = em.unwrap(Session.class);
session.doWork(new Work() {
    @Override
    public void execute(Connection connection) throws SQLException {
        try (Statement statement = connection.createStatement()) {
            statement.executeUpdate(sql);
            connection.commit();
        }
    }
});

系统在Session Session=em.unwrap(Session.class);中停止了很多时间 。之后,出现了许多错误(无法构建Hibernate SessionFactoryCould not get constructor for org.Hibernate.persister.entity.SingleTableEntityPersister),并且在堆栈跟踪的末尾:

Caused by: javax.ejb.ConcurrentAccessTimeoutException: No instances available in Stateless Session Bean pool.  Waited 30 SECONDS

那么,可能是类路径问题吗?我已经在TomEE CDI上遇到了一些问题,这些问题在从旧的EJB容器中删除了一些依赖项后得到了解决。我已经读到CDI问题,原因是与cdi-api依赖项相关的错误导入。

如果有人有一些与我截然不同(而且更简单)的想法来使这种环境发挥作用,那也是受欢迎的。

Maven dependency JavaEE API:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

Maven 依赖项 CDI API:

<dependency>
    <groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>1.2</version>
    <scope>provided</scope>
</dependency>

Maven依赖OpenEJB 4.7.4:

<dependency>
        <groupId>org.apache.openejb</groupId>
        <artifactId>openejb-core</artifactId>
        <version>4.7.4</version>
</dependency>

Maven 依赖项 TomEE 7.0.3:

<dependency>
    <groupId>org.apache.tomee</groupId>
    <artifactId>openejb-core</artifactId>
    <version>7.0.3</version>
</dependency>

Maven依赖Jetty:

    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-server</artifactId>
        <version>9.4.6.v20170531</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-webapp</artifactId>
        <version>9.4.6.v20170531</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-plus</artifactId>
        <version>9.4.6.v20170531</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-jndi</artifactId>
        <version>9.4.6.v20170531</version>
    </dependency>

persistence.xml

<!-- I uncomment only one of this properties each time -->
<!-- <property name="tomee.jpa.factory.lazy" value="true" />-->
<property name="tomee.jpa.cdi" value="false" />

ServiceLocator查找代码(ServiceLocator.lookup(CrudService.class)):

@Override
public Object lookup(Class<?> type, Annotation... annotations) throws NamingException {
    BeanManager manager = CDI.current().getBeanManager();
    Iterator<Bean<?>> beans = manager.getBeans(type, annotations).iterator();

    if (!beans.hasNext()) {
        throw new NamingException("CDI BeanManager cannot find an instance of requested type " + type.getName());
    }
    Bean<?> bean = beans.next();
    CreationalContext<?> ctx = manager.createCreationalContext(bean);
    return manager.getReference(bean, type, ctx);
}

创建EJB容器:

EJBContainer.createEJBContainer(props).getContext(); //nothing special in the props

共有1个答案

澹台星光
2023-03-14

也许只使用org.apache.tomeejavaee api,而不首先使用javax spec jar。

然后,您可能需要一个类强制jndi系统属性(遗憾的是在运行时)首先设置openejb包,因为jetty jndi安装程序会破坏现有设置,假设它是单独的。

也可以共享您的日志或项目,这有助于了解发生了什么。

 类似资料:
  •  什么是 Selenium?   Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个验收测试工具。据 Selenium 主页所说,与其他测试工具相比,使用 Selenium 的最大好处是:   “Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在Windows、Linux 和 MacintoshAnd 上的 Interne

  • 我在无头模式下运行测试时遇到问题。我在两个不同的地方编写了测试用例(web商店和门户)。同样,我使用Headless,当Headless在web shop中为true时,我的测试工作,但当Headless在门户测试用例中为true时,它们不工作。 组织。openqa。硒。ElementClickInterceptedException:元素单击intercepted:元素在点(480483)处不可

  • 我正在尝试使用Jersey测试框架为我的REST API编写功能测试。然而,当我在功能测试中使用依赖注入时,我似乎遇到了一个障碍。我的主应用程序看起来是这样的: 是否有一种方法可以将HK2服务定位器与Jersey测试框架一起使用,或者我是否需要将我的应用程序视为外部容器并使用外部容器提供程序,如这里所述:外部容器? 此外,由于这些是功能测试,因此在这里不允许对注入的服务进行嘲弄。

  • 实际上,我正在创建一个框架,但在创建它时,我只想要它用于串行执行,但现在我想要对方法进行并行测试。问题是,我已经将驱动程序实例声明为静态的,并且由于静态的,第二个线程无法更改它的值。 我在一个单独的类中创建驱动程序,并使用getter方法获取它。 现在的问题是,如果我让Webdrive变成非静态的,那么我就无法在其他类中使用驱动程序。 即使我尝试扩展类(在这里创建驱动程序实例),它也会传递一个空值

  • 我想使用Mojarra和Weld在Apache TomEE上运行一个WebApp。 是否因为TomEE已经使用了另一个CDI-Framework(OpenWebB)而出现了问题?有可能让TomEE和Weld一起运行吗?

  • 问题内容: 我正在尝试使用将项目迁移到Java 12 。 我在编译器设置中添加了: 并在argLine中添加了它,以确保surefire和failsafe: 并得出以下结果: 我也尝试将argLine直接添加到surefire / failsafe配置中,但是结果是相同的。 我在这里想念什么? 我这是surefire / failsafe中的错误吗? EDIT2:Surefire和故障安全配置: