为什么faces-config.xml中的CDI Managed Bean没有注册为obersver?

时间:2016-02-13 14:15:58

标签: jsf cdi managed-bean observers

我已经实现了一个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的观察者?

1 个答案:

答案 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以不同的方式解决。