TomEE嵌入式和自定义JAX-RS应用部署

4

大家好, 我正在使用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>

覆盖openejb.cxf.jax-rs.providers似乎也不起作用。 - avianey
2个回答

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();

迟到总比不到好 ;) - cassiomolin

0

我也遇到了同样的问题。我通过在TestProxyService中添加一个带有@Singleton注释的类并注入我想要测试的资源来解决这个问题。代理类将调用实际的资源类。例如:

@ApplicationPath("/rest")

public class SampleRestResource{
....methods 

}
@Singleton
@ApplicationPath("/rest")

public class TestResource{
 @Inject

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接