Java jersey 2.x依赖注入
您好,我在将下面的代码从jersey 1.x移动到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
@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) {