Как настроить приложение JAX-RS, используя только аннотации (без интернета.xml)?
можно ли настроить приложение JAX-RS, используя только аннотации? (используя сервлет 3.0 и JAX-RS Джерси 1.1.0)
Я пытался и не повезло. Используя некоторые web.xml
кажется, требуется.
конфигурация A (работает, но имеет веб.конфигурация 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
вопросы
почему в интернете.определение xml работало, но аннотации не было? Какая разница?
есть ли способ заставить его работать, например, иметь приложение JAX-RS без интернета.xml?
6 ответов:
* * ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ, ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ TOMCAT ИЛИ JETTY! **
принятый ответ тут работает, но только если веб-приложение развернуто на сервере приложений, таком как Glassfish или Wildfly, и, возможно, контейнеры сервлетов с расширениями EE, такими как TomEE. Это не работа на стандартных контейнерах сервлетов, таких как Tomcat, которые я уверен, что большинство людей, ищущих решение здесь, хотят использовать.
если вы используете стандартную установку Tomcat (или некоторые другие servlet container), вам нужно включить реализацию REST, так как Tomcat не поставляется с ней. Если вы используете Maven, добавьте это к :
<dependencies> <dependency> <groupId>org.glassfish.jersey.bundles</groupId> <artifactId>jaxrs-ri</artifactId> <version>2.13</version> </dependency> ... </dependencies>
затем просто добавьте класс конфигурации приложения в свой проект. Если у вас нет каких-либо особых потребностей в конфигурации, кроме установки пути контекста для служб rest, класс может быть пустым. После добавления этого класса, вам не нужно ничего настраивать в
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).
Кажется, что все, что мне нужно было сделать, это (сервлет 3.0 и выше)
@ApplicationPath("/*") public class MyApplication extends Application { ... }
и нет интернета.конфигурация xml, по-видимому, была необходима (пробовал на Tomcat 7)
Глава 2 JAX-RS: Java™ API для RESTful Web Services спецификация описывает процесс публикации приложения JAX-RS в среде сервлетов (раздел 2.3.2 сервлет в спецификации).
обратите внимание, что рекомендуется использовать только среду Servlet 3 (раздел 2.3.2 Servlet, стр. 6):
рекомендуется, чтобы реализации поддерживали сервлет 3 механизм подключаемости каркаса для обеспечения переносимости между контейнеры и воспользоваться контейнерным классом средства сканирования.
короче говоря, если вы хотите использовать no-web.подход xml, это возможно с пользовательской реализациейjavax.ws.rs.core.Application который регистрирует ресурсы RESTful service сjavax.ws.rs.ApplicationPath аннотации.
@ApplicationPath("/rest")
хотя вы спросили конкретно о Джерси вы также можете прочитать статью реализация RESTful services с JAX-RS и WebSphere 8.5 Liberty Profile в котором я описал no-web.процесс публикации xml для Профиль WebSphere Liberty (С Apache Подмигивание как реализация 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
Как указал @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()); } ... }
Трассировка Стека
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:
Джерси предоставляет два модуля сервлетов. Первый модуль-это модуль Jersey core Servlet, который обеспечивает поддержку интеграции основных сервлетов и требуется в любом контейнере Servlet 2.5 или выше:
<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> </dependency>
для поддержки дополнительного сервлета 3.X режимы развертывания и асинхронная модель программирования ресурсов JAX-RS, дополнительный модуль Джерси требуется:
<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> </dependency>
Джерси-контейнер сервлета модуля зависит от Джерси-контейнер сервлетов-базовый модуль, поэтому при его использовании, не нужно явно объявить Джерси-контейнеров сервлетов основных зависимостей.
https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3