2016-07-26 14 views
6

Tôi có một lớp hiện có mà tôi đang cố gắng đưa vào để lấy một số thông số tiêu đề cho người dùng SSO vào hệ thống của chúng tôi. Lớp học như sau.Truyền đối số @Context sang phương thức trong lớp

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

Những gì tôi đang cố gắng tìm ra là làm thế nào để tôi gọi getAllHeaders() với lập luận @Context? Tôi đã tìm thấy một loạt các ví dụ của lớp tôi có, nhưng không có gì cho thấy làm thế nào để gọi nó.

Tôi cũng đã thử đặt chú thích bên trong lớp thay vì làm đối số.

@Context 
HttpHeaders httpHeaders; 

nhưng khi tôi cố gắng truy cập httpHeaders.getAllHeaders() nó trả về giá trị rỗng. Tôi giả sử bởi vì nó không thực sự được tạo ra bởi vì các tài liệu javax nói nó sẽ không bao giờ trả về null.

Tôi đang cố gắng gọi điều này trong SSOAuthorizationFilter.java của mình, nhưng cũng đã thử truy cập nó qua bộ điều khiển.

+0

Bạn đang sử dụng khung làm việc nào? Spring/RestEasy/Jersey? –

+0

@ Shiraaz.M Spring –

Trả lời

4

Viết chú thích trước.

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

Và sau đó là Trình giải quyết cho điều đó.

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

     } 

    } 
} 

Và trong ResourceConfig chỉ đăng ký Resolver

public class MyResourceConfig extends ResourceConfig { 

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

Và cuối cùng sử dụng nó trong điều khiển của bạn với @SSOAuthorization chú thích.

@GET 
@Path("/get") 
@Produces(MediaType.APPLICATION_JSON) 
public String someMethod(@SSOAuthorization String auth) { 
    return auth; 
} 
Các vấn đề liên quan