Если вы собираетесь использовать аннотацию @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
там, как seen here
После этого, вы можете просто придать ему
@GET
public Response getLocale(@Context Locale locale) {
Если вы хотите использовать пользовательские аннотации, то вам нужно будет реализовать InjectionResolver
для пользовательской аннотации. Вы можете увидеть полный пример here, а также узнать больше в Jersey documentation - Defining Custom Injection Annotation
он не может авторизовать компонент заголовка в вышеуказанном коде – rahul
Что вы говорите так? Я тестировал вышеуказанный код перед отправкой. Я использовал Джерси 2.17 (последнее) для тестирования. Вы что-то отличались от вышеуказанного кода? –
Фактически я использую dropwizard 0.8.1 version – rahul