2016-07-26 12 views
6

Ich habe eine vorhandene Klasse, die ich versuche, einhängen, um einige Header-Parameter zu SSO ein Benutzer in unserem System zu erhalten. Die Klasse ist wie folgt.Übergeben von @Context-Argument an Methode in Klasse

import java.util.Map; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.MediaType; 

import org.springframework.stereotype.Component; 

@Component 
@Path("/http") 
public class HttpResource { 
    @GET 
    @Path("/getHeaders") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Map<String, String> getAllHeaders(@Context HttpHeaders headers) { 
     Map<String, String> headerList = new HashMap<String, String>(); 
     for (String key : headers.getRequestHeaders().keySet()) { 
      String value = headers.getRequestHeader(key).get(0); 
      System.out.println(key + " : " + value); 
      headerList.put(key, value); 
     } 
     return headerList; 
    } 
} 

Was ich versuche, herauszufinden, wie rufe ich getAllHeaders() mit dem @Context Argument? Ich habe eine Menge Beispiele für die Klasse gefunden, die ich habe, aber nichts, was zeigt, wie man es nennt.

Ich habe auch versucht, die Annotation innerhalb der Klasse statt als Argument zu setzen.

@Context 
HttpHeaders httpHeaders; 

aber wenn ich versuche, auf httpHeaders.getAllHeaders() zuzugreifen, gibt es null zurück. Ich nehme an, weil es nicht wirklich erstellt wird, weil die Javax-Dokumente sagen, dass es niemals Null zurückgibt.

Ich versuche, dies in meinem SSOAuthorizationFilter.java zu nennen, habe aber auch versucht, über einen Controller darauf zuzugreifen.

+0

Welchen Rahmen verwenden Sie? Frühling/RestEasy/Jersey? –

+0

@ Shiraaz.M Frühling –

Antwort

4

Schreiben Sie zuerst eine Anmerkung.

@Retention(RUNTIME) 
@Target({ PARAMETER }) 
@Documented 
public @interface SSOAuthorization {} 

Und dann ein Resolver dafür.

public class SSOAuthorizationResolver { 

    public static class SSOAuthorizationInjectionResolver extends 
      ParamInjectionResolver<SSOAuthorization> { 
     public SSOAuthorizationInjectionResolver() { 
      super(SSOAuthorizationValueFactoryProvider.class); 
     } 
    } 


    @Singleton 
    public static class SSOAuthorizationValueFactoryProvider extends 
      AbstractValueFactoryProvider { 

     @Context 
     private HttpHeaders httpHeaders; 

     @Inject 
     public SSOAuthorizationValueFactoryProvider(
       final MultivaluedParameterExtractorProvider mpep, 
       final ServiceLocator injector) { 
      super(mpep, injector, Parameter.Source.UNKNOWN); 
     } 

     @Override 
     protected Factory<?> createValueFactory(final Parameter parameter) { 
      final Class<?> classType = parameter.getRawType(); 

      if (!Language.class.equals(classType) 
        || parameter.getAnnotation(SSOAuthorization.class) == null) { 
       return null; 
      } 

      return new AbstractContainerRequestValueFactory<String>() { 
       @Override 
       public String provide() { 
        // Can use httpHeader to get your header here. 
        return httpHeader.getHeaderString("SSOAuthorization"); 
       } 
      }; 
     } 

    } 

    // Binder implementation 
    public static class Binder extends AbstractBinder { 
     @Override 
     protected void configure() { 

      bind(SSOAuthorizationValueFactoryProvider.class).to(
        ValueFactoryProvider.class).in(Singleton.class); 

      bind(SSOAuthorizationInjectionResolver.class).to(
        new TypeLiteral<InjectionResolver<SSOAuthorization>>() { 
        }).in(Singleton.class); 

     } 

    } 
} 

Und im ResourceConfig registrieren die Resolver

public class MyResourceConfig extends ResourceConfig { 

    public MyResourceConfig(Class... classes) { 
     super(classes); 
     register(new SSOAuthorizationResolver.Binder()); 
    } 
} 

Und es schließlich mit der @SSOAuthorization Anmerkung in Ihrem Controller verwenden.

@GET 
@Path("/get") 
@Produces(MediaType.APPLICATION_JSON) 
public String someMethod(@SSOAuthorization String auth) { 
    return auth; 
} 
Verwandte Themen