首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为泛型继承类型注入?

如何为泛型继承类型注入?
EN

Stack Overflow用户
提问于 2018-10-02 09:41:28
回答 1查看 109关注 0票数 0

我花了很多时间寻找答案,但我想我必须问一问。

我使用Weld-SE来测试我的实体。

我准备了实体随机化器进行测试。

代码语言:javascript
复制
abstract class BaseEntityRandomizer<T extends BaseEntity>
        implements Randomizer<T> {

    @Override public T getRandomValue() {
        ...
    }
}

class MySomeOtherEntityRandomizer
        extends BaseEntityRandomizer<MySomeOther> {

    @Override public MySomeOther getRandomValue() {
        ...
    }
}

现在,使用我的测试类,我想注入那些每个都与泛型参数匹配的随机化器

代码语言:javascript
复制
@ExtendWith(WeldJunit5Extension.class)
@AddPackages({BaseEntityRandomizer.class})
abstract class BaseEntityTest<T extends BaseEntity> {

    @Test void doSome() {
    }

    @Inject
    private BaseEntityRandomizer<T> entityRandomizer;
}

class MySomeOtherTest extends BaseEntityTest<MySomeOther> {
    ...
    // I expect an instance of MySomeOtherRandomizer in injected
    // into the entityRandomizer field.
}

准备了随机化器和测试的子类。

但我没能让它起作用。

我怎么才能让它工作呢?

我尝试了下面的工厂类

代码语言:javascript
复制
class BaseEntityRandomizerFactory {

   @Produces
   public BaseEntityRandomizer<MySome> produceMySomeRandomizer() {
        return new MySomeRandomizer();
   }
}

我得到了

代码语言:javascript
复制
org.jboss.weld.exceptions.IllegalArgumentException: 
WELD-001408: Unsatisfied dependencies for type BaseEntityRandomizer<T extends BaseEntity> with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject protected transient ....BaseEntityTest.entityRandomizer
  at ....BaseEntityTest.entityRandomizer(BaseEntityTest.java:0)
EN

回答 1

Stack Overflow用户

发布于 2021-09-06 07:43:01

实现这一点的一种方法是使用CDI Programmatic lookup。在您的示例中,我将从@Inject Instance<Object>开始,然后您可以使用对select()get()方法的后续调用来获取您想要的任何bean。用法如下所示(假设存在类型为FooBarList<String>的bean):

代码语言:javascript
复制
    @Inject
    private Instance<Object> instance;
    
    @Test void doSome() {
      // selecting and obtaining instances of beans
      Foo foo = entityRandomizer.select(Foo.class).get();
      Bar bar = entityRandomizer.select(Bar.class).get();
      // in case you need to select a parameterized type from instance, use TypeLiteral
      List<String> listBean = entityRandomized..select( new TypeLiteral<List<String>>(){}).get()
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52600970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档