Ответ 1
Кажется, что все, что мне нужно было сделать, это это (Servlet 3.0 и выше)
@ApplicationPath("/*")
public class MyApplication extends Application {
...
}
И никакой конфигурации web.xml, по-видимому, не было (опробован на Tomcat 7)
Можно ли настроить приложение JAX-RS только с помощью аннотаций? (используя Servlet 3.0 и JAX-RS Джерси 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 {
...
}
Последний, похоже, настаивает на том, что приложение будет подклассом Servlet (исключение не оставляет догадок)
java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet
Вопросы
Почему работало определение web.xml, но аннотации не было? Какая разница?
Есть ли способ, чтобы он работал, например. есть приложение JAX-RS без web.xml?
Кажется, что все, что мне нужно было сделать, это это (Servlet 3.0 и выше)
@ApplicationPath("/*")
public class MyApplication extends Application {
...
}
И никакой конфигурации web.xml, по-видимому, не было (опробован на Tomcat 7)
** ПОЖАЛУЙСТА, ЧИТАЙТЕ, ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ ТОМКАТ ИЛИ ЖЕСТКО! **
Принятый ответ работает, но только если webapp развернут на сервер приложений, такой как 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 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).
В главе 2 спецификации JAX-RS: Java ™ API для RESTful Web Services описывается процесс публикации приложения JAX-RS в среде Servlet (раздел 2.3.2 Servlet в спецификации).
Обратите внимание, что рекомендуется использовать среду Servlet 3 (раздел 2.3.2 Servlet, стр. 6):
РЕКОМЕНДУЕТСЯ, что реализации поддерживают Servlet 3 для обеспечения переносимости между контейнеров и использовать контейнерный класс средства сканирования.
Короче говоря, если вы хотите использовать подход no-web.xml, возможно с помощью специальной реализации javax.ws.rs.core.Application, которая регистрирует ресурсы службы RESTful с помощью аннотации javax.ws.rs.ApplicationPath.
@ApplicationPath("/rest")
Хотя вы спросили конкретно о Джерси, вам также может понравиться прочитать статью Внедрение сервисов RESTful с помощью JAX-RS и WebSphere 8.5 Liberty Profile, в которых я описал не- Процесс публикации web.xml для WebSphere Liberty Profile (с Apache Wink в качестве реализации JAX-RS).
Вам нужно настроить правильные зависимости в 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
Как отметил Эран-Медан, JBoss EAP 7.1 (обратите внимание, что без веб-приложения, поэтому нет сервлета, я делал это в проекте EJB 3.2) Мне пришлось добавить атрибут "значение", так как я получал исключение, что атрибут value был необходим.
Это сработало для меня
@ApplicationPath(value="/*")
public class MyApplication extends Application {
private Set singletons = new HashSet();
public MyApplication() {
singletons.add(new MyService());
}
...
}
Трассировка стека
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
Ранее упомянутые зависимости не работали для меня. Из руководства пользователя Jersey:
Джерси предоставляет два модуля Servlet. Первый модуль - это модуль Сервлета с сердечником, который обеспечивает основную поддержку интеграции сервлетов и требуется в любом контейнере 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>
Модуль jerc-container-servlet зависит от модуля ядра-контейнера-сервлета-ядра, поэтому, когда он используется, нет необходимости явно объявлять зависимость ядра jerc-container-servlet.
https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3