2016-07-26 7 views
6

私は既存のクラスを持っています。クラスは以下の通りです。私が把握しようとしている何クラスのメソッドへの@Context引数の受け渡し

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; 
    } 
} 

は、私が@Context引数を指定して呼び出すgetAllHeaders()行う方法ですか?私はクラスの例をたくさん見つけましたが、それをどのように呼び出すかはわかりません。

私は、注釈を引数の代わりにクラスの中に入れてみました。

@Context 
HttpHeaders httpHeaders; 

私がhttpHeaders.getAllHeaders()にアクセスしようとすると、nullを返します。 javaxドキュメントはnullを返すことはないと言っているので、実際には作成されていないので、私は推測します。

私はこれを私のSSOAuthorizationFilter.javaの中で呼び出そうとしていますが、コントローラからもアクセスしようとしています。

+0

どのフレームワークを使用していますか?春/レセプシー/ジャージー? –

+0

@ Shiraaz.M Spring –

答えて

4

注釈を最初に書きます。

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

それでは解決者。

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); 

     } 

    } 
} 

とResourceConfigの中だけでリゾルバ

public class MyResourceConfig extends ResourceConfig { 

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

そして最後に@SSOAuthorization注釈を使用して、コントローラにそれを使用し登録します。

@GET 
@Path("/get") 
@Produces(MediaType.APPLICATION_JSON) 
public String someMethod(@SSOAuthorization String auth) { 
    return auth; 
} 
関連する問題