我已经实现了一个CDI Bean,它正在观察来自另一个bean的事件:
@SessionScoped
public class FixedItemController implements Serializable {
....
public void onWorkflowEvent(@Observes WorkflowEvent workflowEvent) throws AccessDeniedException {
logger.info("evaluate event...");
....
}
....
}
只要我在JSF页面中使用bean并使用其默认名称'fixedItemController',这就可以正常工作。
但是如果我在faces-config.xml中声明该bean的另一个实例,如下所示:
<managed-bean>
<managed-bean-name>myOrderItemController</managed-bean-name>
<managed-bean-class>org.imixs.marty.workflow.FixedItemController</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>childItemProperty</property-name>
<property-class>java.lang.String</property-class>
<value>_orderItems</value>
</managed-property>
</managed-bean>
第二个实例(myOrderItemController)未自动注册为WorkflowEvent的观察者。
我能做些什么,以确保我的第二个实例 - 由faces-config.xml声明 - 将立即实例化并注册为我的workitemEvent的观察者?
答案 0 :(得分:2)
faces-config.xml
未注册CDI托管bean。它注册了JSF托管bean。实际上,您的#{myOrderItemController}
是一个JSF托管bean。就像您使用@ManagedBean
而不是@Named
一样。 JSF bean管理工具不扫描CDI特定的@Observes
注释。
将它保留为CDI托管bean。无论你试图解决什么,你认为在faces-config.xml
中注册它是正确的解决方案必须使用CDI API而不是JSF API以不同的方式解决。