Как настроить Приложение JAX-RS, используя только аннотации (без web.xml)? - PullRequest
75 голосов
/ 21 февраля 2012

Можно ли настроить приложение JAX-RS, используя только аннотации?(используя Servlet 3.0 и JAX-RS Jersey 1.1.0)

Я пытался, но безуспешно.Использование некоторых web.xml кажется обязательным.


Конфигурация A (работает, но имеет конфигурацию web.xml)

web.xml

   ...
   <servlet>
      <servlet-name>org.foo.rest.MyApplication</servlet-name>
   </servlet>
   <servlet-mapping>
       <servlet-name>org.foo.rest.MyApplication</servlet-name>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
   ...

Java

@ApplicationPath("/")
public class MyApplication extends Application {
    ...
}

Конфигурация B (не работает, сгенерировано исключение)

@ApplicationPath("/")
@WebServlet("/*") // <-- 
public class MyApplication extends Application {
    ...
}

Последний, похоже, настаивает на том, что приложение будетподкласс сервлета (исключение не оставляет догадок)

java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet

Вопросы

  1. Почему определение web.xml работает, ноаннотация не?В чем разница?

  2. Есть ли способ, как это работает, например, есть приложение JAX-RS без web.xml?

Ответы [ 6 ]

155 голосов
/ 03 ноября 2014

** ПОЖАЛУЙСТА, ПРОЧТИТЕ, ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ TOMCAT ИЛИ JETTY! **

Принятый ответ работает , но только если веб-приложение развернуто на сервере приложений, таком как Glassfish или Wildfly, и, возможно, в контейнерах сервлетов с расширениями EE, такими как TomEE. Он не работает на стандартных контейнерах сервлетов, таких как Tomcat, которые, я уверен, большинство людей, которые ищут здесь решение, хотят использовать.

Если вы используете стандартную установку Tomcat (или какой-либо другой контейнер сервлета), вам необходимо включить реализацию REST, поскольку Tomcat не поставляется с ней. Если вы используете Maven, добавьте это в раздел dependencies:

<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.bundles</groupId>
    <artifactId>jaxrs-ri</artifactId>
    <version>2.13</version>
  </dependency>
  ...
</dependencies>

Затем просто добавьте класс конфигурации приложения в ваш проект. Если у вас нет особых требований к настройке, кроме настройки пути к контексту для остальных служб, класс может быть пустым. Как только этот класс добавлен, вам не нужно ничего настраивать в web.xml (или вообще иметь его):

package com.domain.mypackage;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest") // set the path to REST web services
public class ApplicationConfig extends Application {}

После этого объявление ваших веб-сервисов выполняется напрямую с использованием стандартных аннотаций JAX-RS в ваших классах Java:

package com.domain.mypackage;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;

// It's good practice to include a version number in the path so you can have
// multiple versions deployed at once. That way consumers don't need to upgrade
// right away if things are working for them.
@Path("calc/1.0")
public class CalculatorV1_0 {
  @GET
  @Consumes("text/plain")
  @Produces("text/plain")
  @Path("addTwoNumbers")
  public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
    return String.valueOf(n1 + n2);
  }
}

Это должно быть все, что вам нужно. Если ваша установка Tomcat выполняется локально на порту 8080, и вы развернули файл WAR в контексте myContext, перейдите к ...

http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3

... должен дать ожидаемый результат (5).

49 голосов
/ 21 февраля 2012

Кажется, что все, что мне нужно было сделать, это (Servlet 3.0 и выше)

@ApplicationPath("/*")
public class MyApplication extends Application {
    ...
}

И, очевидно, не требовалось никаких настроек web.xml (пробовал на Tomcat 7)

14 голосов
/ 02 апреля 2013

Глава 2 JAX-RS: API Java ™ для веб-служб RESTful описывает процесс публикации приложения JAX-RS в среде сервлетов (раздел 2.3.2 Сервлет в спецификации).

Обратите внимание, что рекомендуется использовать только среду Servlet 3 (раздел 2.3.2 Servlet, стр. 6):

РЕКОМЕНДУЕТСЯ, чтобы реализации поддерживали Сервлет 3 механизм подключаемости фреймворка для обеспечения мобильности между контейнеры и воспользоваться контейнером класса средства сканирования.

Короче говоря, если вы хотите использовать подход no-web.xml, это возможно с пользовательской реализацией javax.ws.rs.core.Application , которая регистрирует ресурсы службы RESTful с помощью javax.ws.rs.ApplicationPath аннотация.

@ApplicationPath("/rest")

Хотя вы и спрашивали о Джерси, вы также можете прочитать статью Реализация RESTful-сервисов с JAX-RS и WebSphere 8.5 Liberty Profile , в которой я описал процесс публикации no-web.xml для Профиль WebSphere Liberty (с использованием Apache Wink в качестве реализации JAX-RS).

6 голосов
/ 19 августа 2015

Вам необходимо установить правильные зависимости в pom.xml

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
    </dependency>

Подробнее здесь: Пример для jax-rs

0 голосов
/ 05 марта 2018

Ранее упомянутые зависимости не работали для меня.Из руководства пользователя Джерси:

В Джерси есть два модуля сервлетов.Первый модуль - это основной модуль сервлета в Джерси, который обеспечивает поддержку интеграции основного сервлета и требуется в любом контейнере Servlet 2.5 или выше:

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet-core</artifactId>
</dependency>

Для поддержки дополнительного развертывания Servlet 3.xрежимы и модель асинхронного программирования ресурсов JAX-RS, требуется дополнительный модуль Джерси:

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet</artifactId>
</dependency>

Модуль "джерси-контейнер-сервлет" зависит от модуля "Джерси-контейнер-сервлет-ядро",поэтому при его использовании нет необходимости явно объявлять зависимость jersey-container-servlet-core.

https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3

0 голосов
/ 25 мая 2017

Как указывал @ Eran-Medan, JBoss EAP 7.1 (обратите внимание, что без веб-приложения, поэтому нет сервлета, я делал это в проекте EJB 3.2), мне пришлось добавить атрибут «value» как таковой, так как я получалисключение, что атрибут value был обязательным.

Это сработало для меня

    @ApplicationPath(value="/*")
        public class MyApplication extends Application {

            private Set singletons = new HashSet();

            public MyApplication() {
                singletons.add(new MyService());
            }

            ...
    }

Stack Trace

    Caused by: java.lang.annotation.IncompleteAnnotationException: javax.ws.rs.ApplicationPath missing element value
        at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:80)
        at com.sun.proxy.$Proxy141.value(Unknown Source)
        ... 21 more
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...