JAX-RS-Annotationen: Besser, auf Schnittstellen oder Klassen?
Bin ich früh auf, die in einem REST-Implementierung und haben vor kurzem gelernt, dass wir sicher sein könnten, dass unsere JAX-RS-Annotationen auf Java-service-Schnittstellen, anstatt die Klasse Implementierungen.
Mir, wie es scheint, könnte dies in eine saubere class-Datei, sondern kann auch durch ein in-Entwickler müssen ständig Durcheinander zwischen Dateien.
Was sind die vor-und Nachteile des jeweiligen Ansatzes?
- ähnliche Frage hier: stackoverflow.com/questions/11427283/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie es in ein interface. Vielmehr meine Praxis verlangt von mir, legte Sie es in ein interface, da meine client-und server-Seiten teilen das gleiche jax-rs-definition.
Bin ich geneigt zu verwenden, jax-rs REST-RPC.
Den Grund für die ERHOLUNG ist es, eine web-service-URL-API gewartet und "clientable" von jeder Programmier-framework.
Die Nutzung von jax-rs beschränkt uns auf die Verwendung von java auf der server-Seite.
Die Nutzung von jax-rs REST-RPC beschränkt uns auf die Verwendung von java server-und client-Seiten.
Was ist REST-RPC?
In einer nicht allzu gewundenen Haltung der Erklärung, die RPC ist eine Möglichkeit, den Aufruf einer Funktion/Methode auf dem client, die, wenn Sie über den Draht geschickt wird, bedient der server die gleiche Funktion/Methode vorhanden ist, auf der server-Seite.
RestEasy ermöglicht Ihnen die Verwendung der jax-rs-definition auf der client-Seite zum aufrufen der gleichen Funktion bedient, auf der server-Seite.
RestyGWT, auch mit einigen änderungen an der Schnittstelle geben Sie eine callback-Methode, die Ihnen erlauben würden, sich (etwas) verwenden Sie die jax-rs-definition auf client-und server-Seite. Sie haben einfach ein Skript schreiben, um bewegen Sie den return-Typ in der Typ-argument der callback-Methode.
Könnte man die Frage stellen, warum beschränken uns auf die Durchführung von java auf beiden Seiten? Wäre das nicht eine Niederlage für die Zwecke im Leben des ANDEREN? Ich denke, jax-rs REST-RPC ist ein bequemer Weg zu Implementierung und Test einer jax-rs-service. Wenn Sie implementieren wollten eine jax-rs-service, werden Sie wahrscheinlich tun würde, es zunächst in Java auf beiden Seiten sowieso. Und dann, wenn Ihr Dienst kommt aus dem Boden, könnte man mit dem schreiben von PHP-oder python-clients.
Schreiben der jax-rs-interface-Dateien, die erlauben würde, Sie zu veröffentlichen-Schnittstelle für die clientseitige Operationen. Dies gilt insbesondere für REST-RPC. Aber Sie laufen konnte, behauptet über Ihren jax-rs-definition-veröffentlichen Sie Ihre web-service-API, um nicht-java-Programmierer.
Ich habe einige laufende ausschweifend über dieses Thema...
http://h2g2java.blessedgeek.com/2011/11/gwt-with-jax-rs-aka-rpcrest-part-0.html.
Ich glaube, ich habe zu respektvoll teilweise widersprechen Gesegnet Geek hier. Was erwähnt wird, ist ein sehr spezieller Anwendungsfall erfordert die Nutzung von Anmerkungen, die auf der Schnittstelle.
In meiner eigenen Erfahrung, habe ich auf Fälle gestoßen, wo der Rahmen entweder durch design oder durch Fehler nicht richtig reagiert zu Platzierung von Annotationen auf der Oberfläche. Zum Beispiel, Apache CXF nicht richtig verarbeiten, @PUT-Anfragen mit @PathParams im Pfad definiert, wenn Sie die Anmerkungen auf der Oberfläche. Frag mich nicht warum. CXF ist nicht allein in dieser, der Frühling Sicherheit leidet unter ähnlichen Einschränkungen bei der Platzierung von Beschriftungen auf Schnittstellen. So ist dies ein Kontrapunkt zu den obigen.
In den Fällen, wo Sie sind frei zu wählen, wo die Anmerkungen, ich möchte Sie bitten, zu überlegen, was macht Sinn aus Sicht der Absicht, design, und einfache Entwicklung.
Als ein philosophisches argument, einige Leute sagen, dass die Platzierung von Anmerkungen auf Schnittstellen ist eine andere form von Vertrag-Programmierung - Sie sagen, daß die Implementierungen halten sich an bestimmte Regeln.
Die andere Seite der Medaille ist, dass (je nach Ihrer definition von Schnittstellen), die Schnittstellen sollten nicht egal sein, welche Schritte Ihr implementors, um das Ziel in der Methode festgelegten Vertrag. Zum Beispiel, warum statt ein @Transactional annotation auf eine Schnittstelle wenn Sie zwei Implementierungen, von denen man keine Ahnung hat, was ein "Geschäft" sein könnte?
In der Praxis, die Linien zu verwischen. Im Fall der Definition eines Rest-Endpunkt, können Sie es vorziehen, um die entsprechenden Anmerkungen auf der Oberfläche. Ich denke, das macht Sinn in den meisten Fällen werden Sie wahrscheinlich nicht haben mehrere Implementierungen, in denen die gleiche Signatur der Methode reagiert auf unterschiedliche HTTP-Verben. Aber könnten Sie kommen mit einer situation, in der verschiedene Implementierungen lieber konsumieren und produzieren verschiedene Typen von Medien.
So die große Idee hier ist, "es hängt davon ab." Aber dies ist hoffentlich ein paar Denkanstöße für diejenigen, die vielleicht stolpern Sie diese Frage stellen.
Hatte ich eine ähnliche Frage bei der Verwendung von JAX-RS mit JAX-B. Meine Hoffnung war der Einsatz von JAX-B-Anmerkungen zu Schnittstellen, die nicht Klassen. Das funktioniert nicht, wie ich es erwartet habe, der Grund ist, wegen der unmarshaller. Zur Lösung meiner Probleme, ich landete mit Klassen. Hier ist eine Beschreibung, warum und was ich gefunden habe.