泽西2.x依赖注射

时间:2015-05-08 06:08:29

标签: java jersey-2.0 hk2

您在将以下代码从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集成的文档。

1 个答案:

答案 0 :(得分:2)

如果您打算使用@Context注释,那么您真正需要做的就是实现一个Factory<T>参数化的类型。您甚至可以将其他标准可注射对象注入Factory,例如HttpServletRequestContainerRequestContextHttpHeaders等。例如,要匹配上面示例中的内容

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()。目前支持SingletonRequestScopedPerLookup(如果未指定,则为默认值)

@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) {

在此之后,你可以注入它

require_once( ABSPATH . 'wp-admin/includes/image.php' );

如果要使用自定义注释,则需要为自定义注释实现seen here。您可以查看完整示例InjectionResolver,并在here

中阅读更多内容