Развертывание встроенных и настраиваемых приложений TomEE JAX-RS

Ребята, я использую 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>

person avianey    schedule 20.12.2013    source источник
comment
Переопределение openejb.cxf.jax-rs.providers тоже не работает   -  person avianey    schedule 31.12.2013


Ответы (2)


наконец, решил это, добавив свойство EJBContainer.APP_NAME к свойствам, переданным при создании встроенного контейнера:

Properties properties = new Properties();
properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
properties.setProperty(EJBContainer.APP_NAME, "/");
context = EJBContainer.createEJBContainer(properties).getContext();
person avianey    schedule 15.03.2017
comment
Лучше поздно, чем никогда ;) - person cassiomolin; 16.03.2017

Я также столкнулся с той же проблемой. Я решил это, добавив класс в TestProxyService, аннотированный @Singleton, а затем внедрив ресурс, который я хотел протестировать. Прокси-класс будет вызывать фактический класс ресурсов. Это, например

@ApplicationPath("/rest")

public class SampleRestResource{
....methods 

}
@Singleton
@ApplicationPath("/rest")

public class TestResource{
 @Inject
person user5088684    schedule 07.07.2015