JAX-RS - Können zwei Klassen haben den gleichen @Path identifier?
Ich habe eine webapp, die leitet auf eine bestimmte URI: lassen Sie uns sagen, /service/Bibliothek. In einem anderen bundle, ich habe eine jaxrs-server, die überwacht, /service in der URI, und definiert einige Bohnen, die Anforderung zu verarbeiten. Es gibt durchaus ein paar Bohnen schon da, und eine der Klassen bereits implementiert, um die Anforderungen für /service/Bibliothek. Ich bin versucht, zu erstellen eine neue Klasse, die auch die Verarbeitung von Anforderungen für /service/Bibliothek, aber mit einer anderen absoluten URI-Pfad, zum Beispiel: /service/Bibliothek/mynewlibrary. Meine Frage ist, ist es möglich zu definieren, den gleichen @Path identifier in zwei Klassen, oder muss Sie eindeutig sein, in anderen Worten, ich muss eine URI wie /service/mylibrary für meine neue Klasse Umsetzung statt der Implementierung einer zweiten Klasse, die auch verwendet den gleichen @Path identifier? Ich bin ziemlich neu auf JAX-RS, so dass ich hoffe, meine Frage macht Sinn!
Dank!
- Was passiert, wenn Sie es versuchen?
- Wenn ich es versuchte, keine der Methoden, die in meiner neuen Klasse aufgerufen werden, und nur die Methoden, die von der aktuellen Klasse, Bedienung /service/Bibliothek aufgerufen werden
- sind Sie sicher, dass die neue Klasse registriert ist? Was die JAX-RS-framework verwenden Sie?
- Ich bin mit CXFServlet, wo kann ich sicherstellen, dass die Klasse registriert ist? In meinem beans.xml Datei, es ist mit einem jaxrs:server Adresse="/service" und jaxrs:serviceBeans als "classA und classB, wo classA wird @Path("/library") und classB (meine Klasse) versucht, mit @Path("/library") als gut. Zum Beispiel, eine der Methoden der classA behandelt eine Anfrage für /service/Bibliothek/Bücher, und eine Methode von Klasse B verarbeitet Anfrage für /service/Mediathek/Filme. Ich bin mir nicht erlaubt, fügen Sie einfach eine weitere Methode in classA-Griff /service/Bibliothek/Filme, deshalb möchte ich eine andere Klasse. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es möglich, zwei @Path-Annotationen, die mit dem URI. In deinem Fall, wenn servlet-mapping ist
service
haben, müssen Sie möglicherweise@Path("/library")
und@Path("library/mynewlibrary")
.Wenn die Anfrage eintrifft, die passenden Pfade in absteigender Reihenfolge sortiert werden, so dass die zweite Klasse aufgerufen werden soll, wenn eine Anfrage mit
/service/library/mynewlibrary
kommt.@Path("library/mynewlibrary")
, die du erwähnt hast, die @Path identifier für die Klasse oder die Methode innerhalb der Klasse? Dies ist, was ich versuche zu tun: classA behandeln/service/library/books
- und classB behandeln/service/library/movies
, so dass Sie beide haben eine @Path("/library") - Kennung für Ihre Klasse Erklärung, während die Methoden in den beiden Klassen behandelt zwei unterschiedliche URI ' s. Zum Beispiel, classA.getBooks() haben@Path("/books")
- und classB.getMovies() haben@Path("/movies")
-, vorausgesetzt, Sie sind alle relativen Pfade. Ist es möglich für zwei @Path("/library")?@Path
annotation. Alles klappt jetzt aber, Danke!Es ist sicherlich möglich, dass zwei Methoden mit dem gleichen
@Path
annotation, z.B., wenn Sie sich durch andere Mittel (wie z.B. HTTP-Methode oder@Consumes
annotation). Die@Path
auf eine Klasse fungiert als eine Standard - /root-für die@Path
s auf Methoden der Klasse. Darüber hinaus ist es kein problem, wenn Sie haben, einen Weg, der "in" ein anderes; JAX-RS gibt an, dass die meisten bestimmten Spiel möglich verwendet wird. (Ich ziehe es nicht tun es auf diese Weise, statt mit der "äußeren" Klasse return eine Referenz auf das "innere" Klasse auf einem geeignet teilweise übereinstimmung, so dass jeder Pfad hat einen nachvollziehbaren Weg zu Verantwortung, dass führt definitiv zu einer einzigen Klasse. Das erfordert eine ziemlich unterschiedliche Art und Weise der Vermittlung der@Path
Anmerkungen aber.)Aber wenn Sie ' ve endete mit zwei Methoden, die dazu dienen, die gleiche eingehende Anfrage, Sie habe eine clash und die JAX-RS-Implementierung frei zu wählen, welche zu benutzen (in eine von der Implementierung abhängige Art und Weise). Das ist wahrscheinlich nicht das, was Sie wollen, wie Computern, neigen dazu, schlechte Entscheidungen treffen, wenn da eine freie Wahl.
Können Sie Ihr Ziel erreichen zu müssen /service/Bibliothek/mynewlibrary mit unter Konfiguration.
In Ihre vorhandene Klasse /service/Bibliothek konfiguriert, die auf Klassen-Ebene, so dass Sie können konfigurieren /service auf Klassen-Niveau in der neuen Klasse, die Sie hinzufügen und dann auf methodenebene konfiguriert /library/mynewlibrary.
Diese Weise wird es keinen gleichen Weg für beide Klassen und Ihr Ziel auch erreicht. Ich versuchte dies und es funktioniert.