什么时候再次调用JSF @PostConstruct?

时间:2014-10-01 23:33:18

标签: spring jsf primefaces

我正在使用spring + primefaces

创建一个应用程序

我在托管bean中创建了一个init函数来加载一些有用的数据(bean是@ViewScope

    @PostConstruct
    public void init(){
        log.debug("initing....");
        currentUser = UserUtil.getCurrentUser(this.userManager);
        loadData();
    }

稍后在视图中我有一些标签来隐藏这样的列:

<p:column rendered="#{dataManagedBean.currentUser.manager}"> // to test if the current user is a manager role
...
...
</p:column>

问题是当我使用普通用户登录,然后甚至注销并使用管理员用户登录时,我要显示的列未显示,因为init()方法没有再次调用因此“currentUser”仍然是老一辈(正常的人)

更新

问题可能是我混合了Spring DI和JSF托管bean,还有更多细节

    javabean层中的
  • :我为hibernate使用了@Entity注释
  • 在dao层:我使用@Repository("DataDao")注入daos(来自 弹簧)
  • 在经理层:我使用许多弹簧注释来注入 @Service("DataManager") @Authowire @Qualifier
  • 在视图层,因为我一直使用spring注入,这就是我的原因 使用@Component("DataManagedBean")@ViewScope

我已经使用该应用程序2周了,一切都按预期工作。直到今天我发现@PostConstruct实际上再也没有调用过,视图永远不会被破坏:S(或者它打算像这样工作,单身......)

有人可以向我解释我做错的地方吗?

1 个答案:

答案 0 :(得分:0)

经过对JSF范围的深入阅读,特别感谢@M。 Deinum的评论和@ BalusC先生的excelent article解释了JSF沟通主题。我理解为什么用户对象在logout / relogin之后幸存下来。

我的错误是将Spring DI(使用@Component注释)和JSF注释(使用@ViewScoped)结合起来,然后忽略@ViewScoped注释并使用默认的弹簧范围,默认情况下是单身......