restful-service-Schnittstelle mit jersey
Kann ich erstellen, die einen Rest-Dienst mit Schnittstelle und Implementierung-Klasse? und alle JAX-RS, im Zusammenhang Importe gehen in das interface? ich bin mit jersey2.4 und jetty8.1.
hier ist mein interface:
MyService.java
package foo.bar;
@Path("/abc")
public interface MyService {
@GET
@JSONP
@Path("/method/{id}")
public MyResponse getStuff(@PathParam("id") Integer id);
}
MyServiceImpl.java
package foo.bar.impl;
public class MyServiceImpl implements MyService {
public MyServiceImpl() {}
@Override
public MyResponse getStuff(Integer id) {
//do stuff
return MyResponse;
}
}
hier ist meine web.xml:
<servlet>
<servlet-name>Scivantage REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>foo.bar</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Registrierte ich diese service-provider-Paket (foo.bar) aber es beschwert sich sagen, dies --
javax.- servlet.ServletException: Ein MultiException hat 1 Ausnahmen. Sie sind:|1. java.lang.NoSuchMethodException: Konnte nicht finden, eine geeignete Konstruktor foo.bar.MyService-Klasse.|
Als ich versuchte, mit der Umsetzung class-Paket (foo.bar.impl), es beschwert sich nämlich diesem --
Ich bekomme die HTTP-FEHLERMELDUNG 404; tut nichts anderes, keine exceptions auf der Konsole
Als ich versuchte, beide -- er sich darüber beschwert, der gleiche wie oben:
javax.- servlet.ServletException: Ein MultiException hat 1 Ausnahmen. Sie sind:|1. java.lang.NoSuchMethodException: Konnte nicht finden, eine geeignete Konstruktor foo.bar.MyService-Klasse.|
Können Sie bitte helfen? Was mache ich falsch?
- Haben Sie jemals herausfinden? Ich bin mit dem gleichen Problem.
- ja, aber nicht, wie ich es beschrieb. wir trennten uns-Ressource-Klasse und die service-Klasse. Ressource-Klasse "Komponieren", die von einem service-Objekt-Referenz. Sie können Folgen Sie der Vererbung Grundsätze für Ihre service-Objekt. hoffe, das hilft.
- Ich fand das ist ein bug der mit dem Trikot, wenn man es automatisch suchen für die Anbieter/etc mit es-Paket Scannen. Wenn Sie sich explizit registrieren der Ressourcen - /provider-Klassen, die Sie nicht bekommen diesen Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist zwar eine Frage gepostet, vor einem Jahr, hier ist eine Lösung, die ich stieß nach ein paar versuchen (ich arbeite mit Steg 9 und jersey 2.13): statt mit dem interface (mit
@Path("/abc")
), versuchen Sie, kommentieren Sie die Implementierung der Klasse statt. Ich denke, dies macht Sinn, da die Schnittstelle sind 'Abstrakt', und nicht sein gebunden an physische Pfade. Auf diese Weise kann das interface erneut verwendet werden in verschiedenen Pfaden.Wenn Sie möchten, um die Verwendung von Schnittstellen mit JAX-RS-Annotationen können Sie keine längere Suche ein Paket mit dem web.xml
Müssen Sie manuell binden Sie Ihr interface mit Ihrem Ressource-Umsetzung
Grund :
https://java.net/jira/browse/JERSEY-1004
Also we fixed that Jersey will not try to instantiate interfaces.
: sieht aus wie dieses noch nicht festgelegt wurde? Ich bin mit 2.13War ich schwer mit dem "nicht finden Konnten, einen geeigneten Konstruktor" Angelegenheit. Ich wollte alle meine Notizen (mit @Path) auf meinem Schnittstellen. Ich war in der Lage, damit es funktioniert, indem die Verwaltung des Lebenszyklus der Ressourcen selbst, anstatt Jersey instanziieren Sie.
Zum Beispiel, wenn Sie hatte
YourImplementation
implementiertYourRestInterface
würden Sie etwas tun, wie dies zum registrieren einer Instanz der Implementierung mit Jersey:In der Klasse
ResourceConfig
gibt es einen Konstruktor wie dieseKonstruktor erstellen Sie eine neue Ressource-Konfiguration initialisiert mit einer gegebenen Menge von Ressourcen - /provider-Klassen.
So können Sie erweitern
ResourceConfig
zu registrieren, die Umsetzung Klasse.Konfigurieren Sie dann
web.xml
.Aber der einfachste Weg ist, dass registrieren Sie die Implementierung der Klasse in
web.xml
.DefaultResourceConfig
Ja, Sie können die Schnittstelle zu kommentieren. In unserer Anwendung haben wir umgesetzt, indem auf diese Weise. Folgendes Zitat stammt aus jersy legalisiert Spezifikationen.
Ich denke, in Ihrem Fall den Fehler, da Sie möglicherweise übersehen haben-Zuordnung bitte prüfen.
<servlet-mapping>
<servlet-name>api</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>