jersey 2: so erstellen Sie benutzerdefinierte HTTP-param-Bindung
Ich versuche, erstellen Sie einen benutzerdefinierten http-param-Bindung für meine restful-service. Bitte schauen Sie sich das Beispiel unten.
@POST
@Path("/user/{userId}/orders")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public MyResult foo(@PathParam("userId") String someString, @UserAuthHeaderParam String authString){
}
Können Sie sehen, dass es eine UserAuthHeaderParam Anmerkung in der Funktion Signatur. Was ich tun will, ist haben einen benutzerdefinierten http-param verbindlich andere als die standard javax.ws.rs.*Param .
Habe ich versucht zu implementieren org.glassfish.hk2.api.InjectionResolver die im Grunde extrahieren Sie den Wert aus dem http-header:
public class ProtoInjectionResolver implements InjectionResolver<UserAuthHeaderParam>{
...
@Override
public Object resolve(Injectee injectee, ServiceHandle< ? > root)
{
return "Hello World";
}
...
}
Mir beim Aufruf der restful-Dienst, der server unter Ausnahmen. Es zeigt an, dass der Rahmen nicht zu lösen ist der Parameter in der Funktions-Signatur:
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=String,parent=MyResource,qualifiers={}),position=0,optional=false,self=false,unqualified=null,2136594195),
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of rs.server.MyResource errors were found
Bitte helfen. Jede Beratung wird sehr geschätzt. Ich mache eine Menge Suche auf google, aber nicht, um es arbeiten. Jersey 2.*. Wie ersetzen InjectableProvider und AbstractHttpContextInjectable Jersey-1.* könnte die gleiche Frage stellen.
-- UPDATES:
Ich benutze AbstractBinder zu binden meiner Auflösung, um die UserAuthHeaderParam:
public class MyApplication extends ResourceConfig
{
public MyApplication()
{
register(new AbstractBinder()
{
@Override
protected void configure()
{
//bindFactory(UrlStringFactory.class).to(String.class);
bind(UrlStringInjectResolver.class).to(new TypeLiteral<InjectionResolver<UrlInject>>()
{
}).in(Singleton.class);
}
});
packages("rs");
}
}
Danke!
- Wo ist das @ - Service?
- Ich registrieren Sie einen AbstractBinder. edit meine Frage zu add diese details
- welche version von jersey jar verwenden Sie? sind Sie es läuft auf jedem application server oder grizzly ?
- Ich bin mit jersey 2.0 mit grizzly.
- warum wollen Sie tun, erstellen Sie einen benutzerdefinierten Http-Param ? vielleicht können Sie ein
@HeaderParam
und übergeben Sie die UserAuth Wert durch HTTP-Header, um Ihre REST-API ? - Vielen Dank für Ihren Kommentar. was ich wirklich brauchen ist, um alle http-Header Bindung zu einem Objekt. Jede Lösung, um dies zu erreichen wird sehr geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn alle Sie wollen, ist pass " - Wert direkt aus der Kopfzeile auf die Methode, die Sie nicht brauchen, um erstellen Sie benutzerdefinierte Anmerkungen. Lassen Sie uns sagen, Sie haben einen header
Authorization
, dann können Sie einfach darauf zugreifen, indem Sie erklärt Ihre Methode so:Können Sie es testen durch Aufruf
curl
z.B.Gegeben, dass die Antwort auf Ihre Frage, wie man erstellen Sie benutzerdefinierte Bindung ist wie folgt.
Zuerst müssen Sie erklären, Ihre Anmerkung so:
Nachdem Sie Ihre annotation deklariert Sie haben zu definieren, wie es gelöst wird. Deklarieren Sie die Value-Factory-Provider (dies ist, wo Sie ll haben Zugriff auf die header-Parameter - siehe mein Kommentar):
Deklarieren nun eine Injektion resolver
und einer Sammelmappe für Ihre Konfiguration
nun das Letzte, was, in Ihrem ResourceConfig hinzufügen
register(new HeaderParamResolverBinder())
, wie dieseGegeben haben, sollten Sie nun in der Lage, den Wert zu verwenden, wie Sie wollten:
Ich hoffe, das hilft.
@Path("{id}") public String getResult(@UserAuthHeaderParam String user, @PathParam("id") Integer id)
, wenn es das ist, was Sie für Fragen?AbstractHttpContextValueFactory
auf Jersey2.6. Wissen Sie, was wir verwenden können, statt? Nochmals vielen Dank!Ich weiß nicht, wie zu beheben Ihre Ausnahme. Allerdings darf ich vorschlagen, dass Sie eine andere Art, das gleiche zu tun. Ich hoffe, es hilft.
Habe ich konfrontiert genau das gleiche problem: ich brauche zusätzliche Parameter im http-header (btw, auch mit Authentifizierung). Außerdem muss ich senden Ihnen in jedem Gespräch, da möchte ich einen "typischen" rest-Implementierung, ohne die Aufrechterhaltung einer Sitzung.
Bin ich mit Jersey 2.7 - aber ich würde sagen, es sollte in 2.0. Ich habe folgte Ihre Dokumentation
https://jersey.java.net/documentation/2.0/filters-and-interceptors.html
Es ist ganz klar vorhanden, aber ja, ich copy-paste meine Implementierung unten.
Es funktioniert einwandfrei. Wahr, es gibt einige andere Möglichkeiten, um zu sichern, einen rest-Dienst, zum Beispiel, dies ist ein guter:
http://www.objecthunter.net/tinybo/blog/articles/89
Aber Sie sind abhängig von der Anwendung die server-Implementierung und die Datenbank, die Sie verwenden. Der filter ist, meiner Meinung nach, ist flexibler und einfacher zu implementieren.
Copy-paste: ich habe einen filter definiert, die für die Authentifizierung, die für jeden Anruf und es wird ausgeführt, bevor der service (Dank
@PreMatching
).Haben Sie auch diese filter-Klasse in Ihrer Umsetzung
ResourceConfig
,Hoffe, es hilft!
Wenn Ihr Bedarf abrufen, die alle http-Header Bindung zu einem Objekt, eine Lösung könnte sein, die
@Context
Kommentar zu bekommenjavax.ws.rs.core.HttpHeaders
; enthält die Liste aller request-Header.hier ist meine eigentliche implementatipn von UserAuthHeaderParamValueFactoryProvider Klasse