Ist es möglich, eine JAX-RS-Anwendung nur mit Anmerkungen einzurichten? (mit Servlet 3.0 und JAX-RS Jersey 1.1.0)
Ich habe es versucht und hatte kein Glück. Einige zu verwenden web.xml
scheint erforderlich.
Konfiguration A (funktioniert, hat aber die Konfiguration 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 {
...
}
Konfiguration B (funktioniert nicht, Ausnahme ausgelöst)
@ApplicationPath("/")
@WebServlet("/*") // <--
public class MyApplication extends Application {
...
}
Letzterer scheint darauf zu bestehen, dass die Anwendung eine Unterklasse von Servlet sein wird (die Ausnahme lässt keine Vermutungen zu)
java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet
Fragen
Warum hat die Definition von web.xml funktioniert, die Anmerkung jedoch nicht? Was ist der Unterschied?
Gibt es eine Möglichkeit, es zum Laufen zu bringen, z. B. eine JAX-RS-Anwendung ohne web.xml?
java
jakarta-ee
jax-rs
servlet-3.0
Eran Medan
quelle
quelle
Antworten:
** BITTE LESEN SIE, WENN SIE TOMCAT ODER JETTY VERWENDEN! ** **.
Die akzeptierte Antwort funktioniert , jedoch nur, wenn die Webanwendung auf einem App-Server wie Glassfish oder Wildfly und möglicherweise auf Servlet-Containern mit EE-Erweiterungen wie TomEE bereitgestellt wird. Es funktioniert nicht mit Standard-Servlet-Containern wie Tomcat, die sicher die meisten Leute, die hier nach einer Lösung suchen, verwenden möchten.
Wenn Sie eine Standardinstallation von Tomcat (oder einen anderen Servlet-Container) verwenden, müssen Sie eine REST-Implementierung einschließen, da Tomcat keine enthält. Wenn Sie Maven verwenden, fügen Sie dies dem
dependencies
Abschnitt hinzu:<dependencies> <dependency> <groupId>org.glassfish.jersey.bundles</groupId> <artifactId>jaxrs-ri</artifactId> <version>2.13</version> </dependency> ... </dependencies>
Fügen Sie dann einfach eine Anwendungskonfigurationsklasse zu Ihrem Projekt hinzu. Wenn Sie außer dem Festlegen des Kontextpfads für die restlichen Dienste keine speziellen Konfigurationsanforderungen haben, kann die Klasse leer sein. Sobald diese Klasse hinzugefügt wurde, müssen Sie nichts mehr konfigurieren
web.xml
(oder überhaupt eine haben):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 {}
Danach können Sie Ihre Webdienste mithilfe der Standard-JAX-RS-Anmerkungen in Ihren Java-Klassen einfach deklarieren:
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); } }
Dies sollte alles sein, was Sie brauchen. Wenn Ihre Tomcat-Installation lokal auf Port 8080 ausgeführt wird und Sie Ihre WAR-Datei im Kontext bereitstellen
myContext
, gehen Sie zu ...... sollte das erwartete Ergebnis liefern (5).
quelle
web.xml
nicht vorhanden ist. Fügen Sie in Ihrempom.xml
unter "build> plugins" hinzu (falls nicht bereits vorhanden) :<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>
Option.Application
die die@ApplicationPath
Annotation erweitert und hinzufügt . Die Klasse kann leer sein, muss aber vorhanden sein.jersey-container-servlet
, ohne die gesamtejaxrs-ri
Abhängigkeit zu ziehen. ZB in meinem Fall war es'org.glassfish.jersey.core:jersey-server:2.18'
+'org.glassfish.jersey.containers:jersey-container-servlet:2.18'
.Es scheint, dass alles, was ich tun musste, dies ist (Servlet 3.0 und höher)
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/*") public class MyApplication extends Application { ... }
Und anscheinend war keine web.xml-Konfiguration erforderlich (auf Tomcat 7 ausprobiert)
quelle
Kapitel 2 der Spezifikation JAX-RS: Java ™ API für RESTful Web Services beschreibt den Veröffentlichungsprozess einer JAX-RS-Anwendung in einer Servlet-Umgebung (Abschnitt 2.3.2 Servlet in der Spezifikation).
Bitte beachten Sie, dass die Servlet 3-Umgebung nur empfohlen wird (Abschnitt 2.3.2 Servlet, Seite 6):
Kurz gesagt, wenn Sie einen nicht-web.xml Ansatz verwenden wollen, ist es möglich , mit einer benutzerdefinierten Implementierung von javax.ws.rs.core.Application , dass die Registern RESTful Service - Ressourcen mit der javax.ws.rs.ApplicationPath Anmerkung.
@ApplicationPath("/rest")
Obwohl Sie speziell nach Jersey gefragt haben, möchten Sie vielleicht auch den Artikel Implementieren von RESTful-Diensten mit JAX-RS und WebSphere 8.5 Liberty Profile lesen, in dem ich den Veröffentlichungsprozess no-web.xml für WebSphere Liberty Profile (mit Apache Wink als Implementierung von) beschrieben habe JAX-RS).
quelle
@ApplicationPath("")
Ich verwende , um meine REST-Services im Stammverzeichnis (relativ zum Webapp-Kontextstammverzeichnis) auf JBoss EAP 7 zu haben . Ich habe wederbeans.xml
nochweb.xml
.Sie müssen die richtigen Abhängigkeiten in pom.xml einrichten
<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>
Weitere Details hier: Starterbeispiel für jax-rs
quelle
<failOnMissingWebXml>
Die zuvor genannten Abhängigkeiten haben bei mir nicht funktioniert. Aus dem Jersey-Benutzerhandbuch:
https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3
quelle
Wie @ Eran-Medan betonte, musste ich bei JBoss EAP 7.1 (Hinweis ohne Webanwendung, also kein Servlet, ich habe es in einem EJB 3.2-Projekt ausgeführt) das Attribut "value" als solches hinzufügen, da ich eine Ausnahme erhielt, dass das Wertattribut war erforderlich.
Das hat bei mir funktioniert
@ApplicationPath(value="/*") public class MyApplication extends Application { private Set singletons = new HashSet(); public MyApplication() { singletons.add(new MyService()); } ... }
Stapelverfolgung
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
quelle