我正在尝试使用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注入此类怪人的任何提示?
答案 0 :(得分:2)
据我所知,CDI(see spec)
的HK2注射规则相同在某些时候,它提到:
但是,某些Java类型不是合法的bean类型:
- 类型变量不是合法的bean类型。
- 包含通配符类型参数的参数化类型不是合法的bean类型。
- 一种数组类型,其组件类型不是合法的bean类型。
我认为在我的示例中,我正在尝试创建包含通配符的参数化类型的TypeLiteral
。
无论如何,在我的情况下,我删除了无限类型,它的工作原理。需要做的改变是:
bind(transformationServices)
.to(new TypeLiteral<List<TransformationService>>() {});