【问题标题】:TomEE embedded and custom JAX-RS application deploymentTomEE 嵌入式和自定义 JAX-RS 应用程序部署
【发布时间】:2013-12-20 07:48:18
【问题描述】:

伙计们, 我将 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 似乎也不起作用

标签: java maven jax-rs cxf apache-tomee


【解决方案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();

【讨论】:

  • 迟到总比没有好;)
【解决方案2】:

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

@ApplicationPath("/rest")

public class SampleRestResource{
....methods 

}
@Singleton
@ApplicationPath("/rest")

public class TestResource{
 @Inject

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多