我在@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资源中注入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。这是正常行为。
现在,如果我将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中注入。
我错过了什么或者我的实施有什么问题吗?
感谢。
答案 0 :(得分:0)
我解决了用{strong> @Scope
替换JobScoped
范围的@NormalScope
注释的问题。