Как настроить приложение JAX-RS, используя только аннотации (без интернета.в XML)?
можно ли настроить приложение JAX-RS, используя только аннотации? (используя сервлет 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 {
...
}
в последний, похоже, настаивает на том, что приложение будет подклассом сервлета (исключение не оставляет никаких догадок)
java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet
вопросы
Почему веб.определение xml работало, но аннотация не работала? Какая разница?
есть ли способ заставить его работать, например, иметь приложение JAX-RS без интернета.в XML?
6 ответов
** ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ, ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ TOMCAT ИЛИ JETTY! **
принятый ответ тут работа, но только если webapp развернут на сервере приложений, таких как 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: API Java™ для веб-служб RESTful спецификация описывает процесс публикации приложения JAX-RS в среде сервлетов (раздел 2.3.2 сервлет в спецификации).
обратите внимание, что рекомендуется использовать только среду Servlet 3 (раздел 2.3.2 Servlet, стр. 6):
рекомендуется, чтобы реализации поддерживали сервлет 3 механизм сменяемости каркаса для обеспечения переносимости между контейнеры и использовать класс, поставляемый контейнерами сканирующие средства.
короче говоря, если вы хотите использовать no-web.XML-подхода, вполне возможно, с пользовательской реализации пакета javax.с WS.РС.ядро.Приложение что регистрирует ресурсы RESTful сервис с пакета javax.с WS.РС.ApplicationPath Примечание.
@ApplicationPath("/rest")
хотя вы спрашивали конкретно о Джерси, вы также можете прочитать статью реализация служб RESTful с помощью JAX-RS и WebSphere 8.5 Liberty Profile в котором я описал no-web.процесс публикации xml для Профиль WebSphere Liberty (С 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
Как отметил @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
ранее упомянутые зависимости не работали для меня. Из руководства пользователя-Джерси:
Джерси предоставляет два модуля сервлета. Первый модуль-это модуль сервлета ядра Джерси, который обеспечивает поддержку интеграции основного сервлета и требуется в любом контейнере сервлета 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>
модуль jersey-container-servlet зависит от модуля jersey-container-servlet-core, поэтому при его использовании нет необходимости явно объявлять зависимость jersey-container-servlet-core.
https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3