HK2 TypeLiteral和通配符

时间:2015-11-20 15:57:40

标签: java jersey-2.0 hk2

我正在尝试使用Jersey和HK2。我需要绑定非常奇怪的类型:

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注入此类怪人的任何提示?

1 个答案:

答案 0 :(得分:2)

据我所知,CDI(see spec

的HK2注射规则相同

在某些时候,它提到:

  

但是,某些Java类型不是合法的bean类型:

     
      
  • 类型变量不是合法的bean类型。
  •   
  • 包含通配符类型参数的参数化类型不是合法的bean类型。
  •   
  • 一种数组类型,其组件类型不是合法的bean类型。
  •   

我认为在我的示例中,我正在尝试创建包含通配符的参数化类型的TypeLiteral

无论如何,在我的情况下,我删除了无限类型,它的工作原理。需要做的改变是:

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