2015-05-08 6 views
2

привет Я перед проблемой при перемещении ниже код из джерси 1.x в Джерси 2.xДжерси инъекции 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 доступен в Джерси 2.0, но я не могу похоже, найти документы, которые помогают интеграции с Джерси 2.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 там, как seen here

После этого, вы можете просто придать ему

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

Если вы хотите использовать пользовательские аннотации, то вам нужно будет реализовать InjectionResolver для пользовательской аннотации. Вы можете увидеть полный пример here, а также узнать больше в Jersey documentation - Defining Custom Injection Annotation

+0

он не может авторизовать компонент заголовка в вышеуказанном коде – rahul

+0

Что вы говорите так? Я тестировал вышеуказанный код перед отправкой. Я использовал Джерси 2.17 (последнее) для тестирования. Вы что-то отличались от вышеуказанного кода? –

+0

Фактически я использую dropwizard 0.8.1 version – rahul