2

こんにちは、以下のコードを jersey 1.x から jersey 2.x に移動する際に問題に直面しています。

@Provider
public class LocaleProvider
      extends AbstractHttpContextInjectable<Locale>
      implements InjectableProvider<Context, Type> {

    @Override
    public Injectable<E> getInjectable(ComponentContext ic, Context a, Type c) {
        if (c.equals(Locale.class)) {
            return this;
        }

        return null;
    }

    @Override
    public ComponentScope getScope() {
        return ComponentScope.PerRequest;
    }

    @Override
    public Locale getValue(HttpContext c) {
        final Locales locales = c.getRequest().getAcceptableLanguages();
        if (locales.isEmpty()) {
          return Locale.US;
        }
        return locales.get(0);
    }
}

また、HK2 が Jersey 2.0 で使用できることも理解していますが、Jersey 2.0 の統合に役立つドキュメントが見つからないようです。

4

1 に答える 1

2

@Contextアノテーションを使用する場合、実際に行う必要があるのはFactory<T>、注入する型によってパラメーター化された を実装することだけです。他の標準的な注入可能なオブジェクトを 、FactoryたとえばHttpServletRequestContainerRequestContextなどに注入することもできますHttpHeaders。たとえば、上記の例で何が起こっているかを一致させるには

import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import javax.ws.rs.core.HttpHeaders;
import org.glassfish.hk2.api.Factory;

public class LocaleFactory implements Factory<Locale> {

    private final HttpHeaders headers;

    @Inject
    public LocaleFactory(HttpHeaders headers) {
        this.headers = headers;
    }

    @Override
    public Locale provide() {
        List<Locale> acceptableLanguges = headers.getAcceptableLanguages();

        if (acceptableLanguges.isEmpty()) {
            return Locale.US;
        }

        if ("*".equals(acceptableLanguges.get(0).toString())) {
            return Locale.US;
        }

        return acceptableLanguges.get(0);
    }

    @Override
    public void dispose(Locale t) { /* Do nothing */ }
}

次に、ファクトリをバインドする必要があります。たとえば、あなたのResourceConfig. 例のように、そこにスコープを設定できgetScope()ます。現在、SingletonRequestScopedandがサポートされPerLookupています (指定されていない場合はこれがデフォルトです)。

@ApplicationPath("/api")
public class AppConfig extends ResourceConfig {

    public AppConfig() {
        packages("packages.to.scan");

        register(new AbstractBinder(){
            @Override
            public void configure() {
                bindFactory(LocaleFactory.class).to(Locale.class)
                                         .in(RequestScoped.class);
            }
        });
    }
}

web.xml を使用している場合は、ここに示すように、そこに を作成し登録Featureできます。AbstractBinder

この後、注入するだけです

@GET
public Response getLocale(@Context Locale locale) {

カスタム アノテーションを使用する場合は、カスタム アノテーション用に を実装する必要がありますInjectionResolverここで完全な例を見ることができ、 Jersey のドキュメント - カスタム注入アノテーションの定義で詳細を読むことができます。

于 2015-05-08T08:12:55.400 に答える