Использование EJB в службе JAX-RS (CXF) и TomEE 7.0.1

Я пытаюсь сделать следующее (много деталей, извините...):

Иметь службу jax-rs с @EJB, чтобы избежать поиска jndi. Что-то типа

@Path("rest/my-path)
public class Service {

  @EJB
  private MyEJB me;

  @Path("foo")
  @GET
  public String foo() {
    return me.foo();
  }
}

Использование CXFNonSpringJaxrsServlet и ограничение url-pattern. web.xml должен выглядеть примерно так:

<servlet>
    <servlet-name>my-servlet</servlet-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
        <param-name>jaxrs.serviceClasses</param-name>
        <param-value>
            com.example.Service
        </param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>my-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Так что теоретически http://localhost:8080/my-app/rest/my-path/foo позвонит, как вы догадались, foo()

Журнал TomEE поддерживает это:

Установка адреса публикации сервера в / REST Application:

http://localhost:8080/my-app/

URI: http://localhost:8080/my-app/rest/my-path

ПОЛУЧИТЬ http://localhost:8080/my-app/rest/my-path/foo

Но на самом деле комбинация отображения сервлетов и преобразователя jaxrs делает

http://localhost:8080/my-app/rest/my-path/foo вернуть 404

и (обратите внимание на дубль /rest/rest/)

http://localhost:8080/my-app/rest/rest/my-path/foo фактически вызывает метод, но MyEJB имеет значение null

Не удалось найти комбинацию сопоставления сервлета и пути службы и jaxrs.address, которая заставляет корневой URL-адрес возвращать index.html, а правильный URL-адрес службы вызывает foo, а MyEJB не равен нулю

Любые идеи, как это решить?


person Aviram    schedule 16.08.2016    source источник


Ответы (1)


Удалите это из своего web.xml:

<servlet>
    <servlet-name>my-servlet</servlet-name>
    <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
    <init-param>
        <param-name>jaxrs.serviceClasses</param-name>
        <param-value>
            com.example.Service
        </param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>my-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

TomEE автоматически сканирует ваше приложение и добавляет любые контроллеры REST. Во время запуска журналы будут содержать путь к вашему URL-адресу REST. Вам может понадобиться добавить Application.class следующим образом:

@ApplicationPath("/rest-prefix")
public class ApplicationConfig extends Application {
    public Set<Class<?>> getClasses() {
        return new HashSet<Class<?>>(Arrays.asList(Service.class));
    }
}
person Jonathan S. Fisher    schedule 16.08.2016
comment
Благодарность! Я использую решение Application. Что меня беспокоит, так это отсутствие документации и (слишком) слабая связь между спецификациями сервлета и jax-rs. Было интересно, может ли кто-нибудь объяснить это... - person Aviram; 16.08.2016
comment
Случайный странный факт: под прикрытием JAX-RS — это сервлет, он просто встроен в сервер :) - person Jonathan S. Fisher; 17.08.2016
comment
Говоря о документации, используйте официальное руководство Oracle по Java EE или страницу примеров TomEE! Они всегда показывают вам правильный способ делать вещи. Ваш пример будет тем, что вам нужно сделать для Vanilla Tomcat - person Jonathan S. Fisher; 17.08.2016