簡體   English   中英

將@Context參數傳遞給類中的方法

[英]Passing @Context argument to method in class

我有一個現有的類,我正試圖將一些頭參數提供給SSO用戶進入我們的系統。 課程如下。

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中調用它,但也嘗試通過控制器訪問它。

首先編寫注釋。

@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中只需注冊Resolver

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM