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.

InformationsquelleAutor yzandrew | 2014-04-22
Schreibe einen Kommentar