CDI作为工厂?

CDI as a factory?

我的 JAX-RS 上有这个端点 Java EE 应用程序:

public class SearchEndpoint implements ISearchEndpoint 
{

    @Inject protected SearchService searchService;

    @Override
    public Response search()
    {
        return Response.ok().entity(this.searchService.search()).build();
    }

}

searchService's search方法中:

public class SearchService {

    @Inject private QueryVisitor visitor;

    public List<?> search() {
        for (Expression<?> group : groups)
            group.accept(this.visitor);
    }
}

然后在QueryVisitor,

@Override
public ESEntityPathPointer<?> visit(Expression<?> expr, ESEntityPathPointer<?> context) {
    switch ((EntityType)expr.getMetadata().getElement())
    {
        case digitalInput:
            if (context == null)
                context = new DigitalInputESEntityPathPointer();
            break;
        case followUpActivity:
            if (context == null)
                context = new FollowUpActivityESEntityPathPointer();
            break;
        case ...;
    }
    return context;
}

因此,CDI 在我的 JAX-RS 端点实现中注入了一个 SearchService,然后 CDI 在之前注入的 SearchService.

中注入了一个 QueryVisitor

所以,正如您基本猜到的那样,QueryVisitor.visit 充当工厂。根据 EntityType 枚举值,它创建一个 ESEntityPathPointer<?> 对象或另一个对象。

我希望这些对象是使用 CDI 创建的。 我已经阅读了一些相关内容,但我不太清楚如何执行此操作。

有什么想法吗?

尝试以下操作:

SomeBean bean = CDI.current().select(SomeBean.class).get();

使用限定符?尝试以下操作:

SomeBean bean = CDI.current().select(SomeBean, 
                                     new AnnotationLiteral<Qualifier1>(){}, 
                                     new AnnotationLiteral<Qualifier2>(){}).get();