JAX-RS - Können zwei Klassen den gleichen @Path-Bezeichner haben?

9

Ich habe eine Webanwendung, die zu einem bestimmten URI weiterleitet: sagen wir / service / library . In einem anderen Paket habe ich einen Jaxrs-Server, der im URI auf / service wartet und einige Beans definiert, die die Anfrage verarbeiten. Es gibt bereits einige Beans, und eine der Klassen ist bereits implementiert, um Anfragen für / service / library zu bearbeiten. Ich versuche, eine neue Klasse zu erstellen, die auch Anforderungen für / service / library verarbeitet, jedoch mit einem anderen absoluten URI-Pfad, zum Beispiel: / service / library / mynewlibrary . Meine Frage ist, ist es möglich, den gleichen @Path Bezeichner in zwei Klassen zu definieren, oder müssen sie eindeutig sein, mit anderen Worten, muss ich einen URI wie / service / mylibrary für meinen neuen verwenden Klassenimplementierung, anstatt eine zweite Klasse zu implementieren, die auch die gleiche @Path-Kennung verwendet? Ich bin ziemlich neu bei JAX-RS, also hoffe ich, dass meine Frage sinnvoll ist!

Danke!

    
Stephen 18.04.2011, 21:30
quelle

3 Antworten

4

Es ist möglich, zwei @Path-Annotationen zu haben, die mit dem URI übereinstimmen. In Ihrem Fall, wenn Servlet-Mapping service ist, haben Sie möglicherweise @Path("/library") und @Path("library/mynewlibrary") . Wenn die Anfrage eintrifft, werden die übereinstimmenden Pfade in absteigender Reihenfolge sortiert, sodass die zweite Klasse aufgerufen werden muss, wenn eine Anfrage mit /service/library/mynewlibrary eintrifft.

    
Tarlog 19.04.2011, 17:00
quelle
1

Es ist sehr wahrscheinlich möglich, zwei Methoden mit der gleichen @Path Annotation zu verwenden, z. B. wenn sie auf andere Weise unterschieden werden (z. B. HTTP-Methode oder @Consumes Annotation). Das @Path für eine Klasse fungiert als Standard / root für das @Path s für die Methoden der Klasse. Außerdem ist es überhaupt kein Problem, wenn Sie einen Weg haben, der "innerhalb" eines anderen ist; JAX-RS gibt an, dass die genaueste mögliche Übereinstimmung verwendet wird. (Ich ziehe es vor, es nicht so zu machen, stattdessen gibt die "äußere" Klasse einen Verweis auf die "innere" Klasse bei einer passenden Teilübereinstimmung zurück, so dass jeder Pfad einen nachvollziehbaren Weg zur Verantwortlichkeit hat, der definitiv zu einer einzigen Klasse führt. Das erfordert jedoch eine ziemlich andere Art, die @Path Annotationen anzuordnen.)

Wenn Sie jedoch zwei Methoden gefunden haben, die die gleiche eingehende Anfrage bedienen können, haben Sie einen Konflikt und die JAX-RS-Implementierung kann frei wählen, welche (in einer implementierungsabhängigen Weise) zu verwenden ist. . Das ist wahrscheinlich nicht das, was Sie wollen, da Computer dazu neigen, schlechte Entscheidungen zu treffen, wenn sie eine freie Wahl haben.

    
Donal Fellows 25.04.2011 05:20
quelle
0

Sie können Ihr Ziel erreichen, wenn Sie / service / library / mynewlibrary unter Konfiguration verwenden.

In Ihrer vorhandenen Klasse haben Sie / service / library auf Klassenebene konfiguriert, so dass Sie auf Klassenebene in der neuen Klasse, die Sie hinzufügen, und dann auf Methodenebene configure / library / mynewlibrary den Dienst / service konfigurieren können.

Auf diese Weise wird es nicht den gleichen Pfad für beide Klassen haben und Ihr Ziel wird auch erreicht. Ich habe es versucht und es funktioniert.

    
Prakash Boda 19.11.2015 11:48
quelle

Tags und Links