我们, 我正在使用TomEE 1.6.0(jax-rs)和自定义应用程序:
@ApplicationPath("/rest")
public class Whatever extends Application {...}
我这样做是为了自定义REST服务的基本路径,并为此应用程序的每个端点添加自定义提供程序:
<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1">
<pojo-deployment class-name="Whatever">
<properties>
cxf.jaxrs.providers = WhateverProvider
</properties>
</pojo-deployment>
</openejb-jar>
我有一个像这样定义的样本JAX-RS端点:
@Path("/whatever")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public class WhateverEndpoint {...}
在TomEE jax-rs( tomee-maven-plugin:start )中部署时,一切正常。 我可以在 / rest / whatever
上拨打我的服务问题在于,当我想使用TomEE Embedded对此服务进行单元测试时, WhateverEndpoint 未部署...
我用于测试设置(@BeforeClass)的配置如下:
Properties properties = new Properties();
properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
context = EJBContainer.createEJBContainer(properties).getContext();
我可以测试DAO等但不测试端点...... 当我像这样添加@javax.ejb。*注释时:
@Singleton
@Path("/whatever")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public class WhateverEndpoint {...}
我在日志中有更好的东西:
INFO - Initializing network services
INFO - REST Application: http://127.0.0.1:4204/web -> org.apache.openejb.server.rest.InternalApplication
INFO - Service URI: http://127.0.0.1:4204/web/whatever -> EJB Whatever
INFO - GET http://127.0.0.1:4204/web/whatever/a -> A a(HttpServletRequest)
INFO - ** Bound Services **
INFO - NAME IP PORT
INFO - httpejbd 127.0.0.1 4204
INFO - admin 127.0.0.1 4200
INFO - ejbd 127.0.0.1 4201
INFO - ejbds 127.0.0.1 4203
我应该如何使其与我的自定义JAX-RS应用程序,路径和提供程序一起正常工作,就像TomEE JAX-RS一样,并且不添加ejb注释?我应该在创建EJBContainer时定义其他属性和哪个属性?我在示例应用程序中看到了一些内容:
但他们都没有工作。
这是我的pom.xml:
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0-5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>tomee-embedded</artifactId>
<version>${tomee.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>openejb-cxf-rs</artifactId>
<version>${openejb.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>tomee-jaxrs</artifactId>
<version>${tomee.version}</version>
<scope>test</scope>
</dependency>
答案 0 :(得分:1)
最后通过将EJBContainer.APP_NAME属性添加到创建嵌入式容器时传递的属性来解决它:
Properties properties = new Properties();
properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
properties.setProperty(EJBContainer.APP_NAME, "/");
context = EJBContainer.createEJBContainer(properties).getContext();
答案 1 :(得分:0)
我也面临同样的问题。我通过在@Singleton注释的TestProxyService中添加一个类然后注入我想要测试的资源来解决这个问题。代理类将调用实际的资源类。 例如
@ApplicationPath("/rest")
public class SampleRestResource{
....methods
}
@Singleton
@ApplicationPath("/rest")
public class TestResource{
@Inject