Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jersey 2.x依赖注入_Java_Jersey 2.0_Hk2 - Fatal编程技术网

Java jersey 2.x依赖注入

Java jersey 2.x依赖注入,java,jersey-2.0,hk2,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> getInjec

您好,我在将下面的代码从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);
    }
}
@Provider
公共类LocaleProvider
扩展AbstractHttpContextInjectable
实现InjectableProvider{
@凌驾
公共可注入getInjectable(ComponentContext ic,上下文a,类型c){
if(c.equals(Locale.class)){
归还这个;
}
返回null;
}
@凌驾
公共组件范围getScope(){
返回ComponentScope.PerRequest;
}
@凌驾
公共区域设置getValue(HttpContext c){
final Locales Locales=c.getRequest().getAcceptableLanguages();
if(locales.isEmpty()){
返回Locale.US;
}
返回locales.get(0);
}
}

我也知道Jersey 2.0中提供了HK2,但我似乎找不到有助于Jersey 2.0集成的文档。

如果要使用
@Context
注释,实际上您需要做的就是实现一个由您想要注入的类型参数化的文档。您甚至可以将其他标准可注入对象注入
工厂
,例如
HttpServletRequest
ContainerRequestContext
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 */ }
}
如果您使用的是web.xml,那么您可以创建
功能
,并在那里注册
AbstractBinder
,如下所示

在这之后,你可以注射它

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

如果要使用自定义注释,则需要为自定义注释实现一个。您可以看到一个完整的示例,并在

中阅读更多内容。无法在上述代码中自动连接headers bean。您为什么这么说?在发布之前,我已经测试了上面的代码。我使用Jersey 2.17(最新版本)进行测试。您是否执行了与上述代码不同的操作?事实上,我使用的dropwizard 0.8.1版本应该没有问题。您是否
env.jersey().register(new AbstractBinder(){…})?是的,我已经完成了env.jersey().getResourceConfig().register(new AbstractBinder(){@Override public void configure(){bindFactory(LocaleFactory.class).to(Locale.class).in(RequestScoped.class);});
@GET
public Response getLocale(@Context Locale locale) {