您在将以下代码从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集成的文档。
答案 0 :(得分:2)
如果您打算使用@Context
注释,那么您真正需要做的就是实现一个Factory<T>
参数化的类型。您甚至可以将其他标准可注射对象注入Factory
,例如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 */ }
}
然后你需要绑定工厂。例如,在ResourceConfig
中。您可以在那里设置范围,如示例中的getScope()
。目前支持Singleton
,RequestScoped
和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) {
在此之后,你可以注入它
require_once( ABSPATH . 'wp-admin/includes/image.php' );
如果要使用自定义注释,则需要为自定义注释实现seen here。您可以查看完整示例InjectionResolver
,并在here