在Batchlet的@ApplicationScoped bean中注入自定义CDI范围

时间:2017-03-07 16:24:26

标签: java-ee dependency-injection scope customization cdi

我在@JobScoped @ApplicationScoped的{​​{1}} bean(批处理API)中注入一个用我自己的Batchlet CDI Scope注释的bean时遇到了问题。

我已经定义了@JobScoped注释:

@Documented
@Scope
@Target({ TYPE, METHOD, FIELD })
@Retention(RUNTIME)
public @interface JobScoped
{
}

我已通过CDI扩展程序注册了我的自定义JobScopeContext

public class JobScopeExtension implements Extension
{
   public void registerJobScopeContext(@Observes final AfterBeanDiscovery p_event, final BeanManager p_beanManager)
   {
      p_event.addContext(new JobScopeContext(p_beanManager));
   }
}

JobScopeContext,实施get API的Context方法来管理我的@JobScoped bean的创建。

public class JobScopeContext implements Context {

    /**
     * {@inheritDoc}
     * 
     * @see javax.enterprise.context.spi.Context#get(javax.enterprise.context.spi.Contextual)
     */
    @Override
    public <T> T get(final Contextual<T> p_contextual) {
        // do stuff
    }

    /**
     * {@inheritDoc}
     * 
     * @see javax.enterprise.context.spi.Context#get(javax.enterprise.context.spi.Contextual,
     *      javax.enterprise.context.spi.CreationalContext)
     */
    @Override
    public <T> T get(final Contextual<T> p_contextual, final CreationalContext<T> p_creationalContext) {
        // do stuff
    }
}

我不会在这里讨论我管理@JobScoped bean生命周期的方式,因为这对我的问题无关紧要。

我现在定义了我的@JobScoped bean:

@JobScoped
public class MyBeanJobScopedImpl implements MyBeanJobScoped {

    @Override
    public String getId() {
        return "MyString";
    }

}

一个@ApplicationScoped bean,它将前一个bean作为依赖项:

@ApplicationScoped
public class MyBeanApplicationScoped {

    @Inject
    private MyBeanJobScoped m_beanJobScoped;

    public String callBeanJobScoped()
    {
        return m_beanJobScoped.getId();
    }

}

现在是我观察到的行为:

在JAX-RS资源中使用

如果我在JAX-RS资源中注入MyBeanApplicationScoped bean:

@Path("custom")
public class RessourceREST {

    @Inject
    private MyBeanApplicationScoped m_beanApplicationScoped;

    @GET
    @Path("testApplicationScoped")
    public String test() {
        return m_beanApplicationScoped.callBeanJobScoped();
    }
}

然后每次调用m_beanApplicationScoped.callBeanJobScoped()方法时,都会调用Context#get(Contextual)类的Context#get(Contextual, CreationalContext)JobScopeContext方法来解析注入的bean。这是正常行为。

在Batchlet中使用(无法按预期工作)

现在,如果我将MyBeanApplicationScoped bean注入Batchlet

@Named("MyBatchlet")
@Dependent
public class MyBatchlet extends AbstractBatchlet{

    @Inject
    private MyBeanApplicationScoped m_beanApplicationScoped;

    @Override
    public String process() throws Exception {
        // TODO Auto-generated method stub

        m_beanApplicationScoped.callBeanJobScoped();
        return "OK";
    }


}

第一次调用Batchlet(启动拥有此Batchlet的作业)时,将调用Context#get(Contextual)类的Context#get(Contextual, CreationalContext)JobScopeContext方法来解析注入的bean。

但是,如果我再次调用该作业,则get的{​​{1}}方法永远不会被再次调用。好像Context bean作为@ApplicationScoped bean在@ApplicationScoped bean中注入。

我错过了什么或者我的实施有什么问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我解决了用{strong> @Scope 替换JobScoped范围的@NormalScope注释的问题。