Можно ли настроить приложение 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>
...
Ява
@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
Вопросов
Почему определение web.xml работает, а аннотация - нет? Какая разница?
Есть ли способ заставить это работать, например, иметь приложение JAX-RS без web.xml?
java
jakarta-ee
jax-rs
servlet-3.0
Эран Медан
источник
источник
Ответы:
** ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ TOMCAT ИЛИ JETTY! **
Принятый ответ делает работу, но только если веб - приложение развернуто на сервер приложений , как Glassfish или Wildfly, и , возможно , сервлет с ЭЭ расширениями как 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
, переходя к ...... должен дать ожидаемый результат (5).
источник
web.xml
нет. В вашемpom.xml
, в разделе «сборки> плагин», добавьте (если уже не существует):<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.3</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin>
.<failOnMissingWebXml>false</failOnMissingWebXml>
опция.Application
и не добавляли@ApplicationPath
к нему аннотацию. Класс может быть пустым, но он должен быть там.jersey-container-servlet
, не растягивая всюjaxrs-ri
зависимость. Например, в моем случае это был'org.glassfish.jersey.core:jersey-server:2.18'
+'org.glassfish.jersey.containers:jersey-container-servlet:2.18'
.Кажется, все, что мне нужно было сделать, это (Servlet 3.0 и выше)
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/*") public class MyApplication extends Application { ... }
И никакая конфигурация web.xml, по-видимому, не нужна (пробовал на Tomcat 7)
источник
В главе 2 спецификации JAX-RS: Java ™ API для веб-служб RESTful описывается процесс публикации приложения JAX-RS в среде сервлетов (раздел 2.3.2 Сервлет в спецификации).
Обратите внимание, что рекомендуется только среда Servlet 3 (раздел 2.3.2 Сервлет, стр. 6):
Короче говоря, если вы хотите использовать подход 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 Profile (с Apache Wink как реализацию JAX-RS).
источник
@ApplicationPath("")
чтобы мои службы REST находились в корне (относительно корневого контекста webapp) на JBoss EAP 7. У меня нет ни,beans.xml
ниweb.xml
.Вам необходимо настроить правильные зависимости в 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
источник
<failOnMissingWebXml>
Ранее упомянутые зависимости у меня не работали. Из Руководства пользователя Джерси:
https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3
источник
Как отметил @ Eran-Medan, 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
источник