2015-11-20 4 views
1

Я пытаюсь использовать Джерси с HK2. Мне нужно, чтобы связать действительно странный тип:HK2 TypeLiteral и подстановочные знаки

List<TransformationService<? extends Transformation, ? extends TransformationInfor>>

Так что я мое связующее определяется следующим образом:

resourceConfig.register(new AbstractBinder() { 
     @Override 
     protected void configure() { 
      List<TransformationService<? extends Transformation, ? extends TransformationInfo>> transformationServices = ... ; 

      bind(transformationServices) 
        .to(new TypeLiteral<List<TransformationService<? extends Transformation, ? extends TransformationInfo>>>() {}); 

      // This class needs the list for its construction 
      bind(TransformationServiceImpl.class).to(TransformationService.class); 
     } 
    }); 

Когда я запускаю код, хотя я получаю исключение, что мой список не может быть введен (пакеты опущены):

[11/20/15 16:46:34] WARNING org.glassfish.jersey.internal.Errors logErrors : The following warnings have been detected: WARNING: Unknown HK2 failure detected: 
MultiException stack 1 of 3 
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=List<TransformationService<? extends ...Transformation,? extends ...TransformationInfo>>,parent=TransformationServiceImpl,qualifiers={},position=3,optional=false,self=false,unqualified=null,334434299) 
    at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74) 
    at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:214) 

Любые советы о том, как вводить такой странный HK2?

+0

Я думаю, что это отвечает здесь: http://stackoverflow.com/questions/23992714/how-to-inject-an-unbound-generic-type-in-hk2 –

ответ

1

Насколько я понимаю, правила инъекций ¯hk2 одинаковы для КДИ (see spec)

В какой-то момент он упоминает:

Однако некоторые типы Java не являются юридическими виды фасоли:

  • Переменная типа не является юридическим видом.
  • Параметрированный тип, содержащий параметр типа подстановочного знака, не является законным типом бобов.
  • Тип массива, тип компонента которого не является юридическим компонентом.

Я думаю, что в моем примере я пытаюсь создать TypeLiteral из параметризованном типа, который содержит подстановочные.

В любом случае, в моем случае я удалил этот неограниченный тип, и он работает. Изменение было нужно:

bind(transformationServices) 
    .to(new TypeLiteral<List<TransformationService>>() {}); 
+0

Это true, что hk2 использует те же правила для безопасности типов, которые использует CDI. Я должен был бы выглядеть глубже, если бы у вас не было вашего конкретного случая использования, эти правила выглядят как волосатые – jwells131313