【问题标题】:jsf2 spring managed bean calling constructor and postconstruct only on tomcatstartupjsf2 spring托管bean调用构造函数和postconstruct仅在tomcatstartup上
【发布时间】:2012-05-26 01:09:00
【问题描述】:

我正在使用 JSF+Spring 项目,我的 spring maanged bean 是 ViewScoped

我的保存状态是客户端。

<context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>

以下是我的 bean,我发现 bean 的构造函数和 postconstruct 方法仅在 tomcat 启动时被调用,当它是 Spring 托管 bean 而不是 JSF 托管 bean 构造函数和 postconstruct 在每次页面刷新时调用。 如果我想在 spring 托管 bean 下每次刷新页面时调用方法,这是真正的行为吗? id 应该做什么?

@Component
@ViewScoped
public class DataTableBean implements Serializable{

public DataTableBean() {
        super();
}

@PostConstruct
    private void loadDataData(){
        System.out.println("Post constructing");
    }
}

【问题讨论】:

  • 只是想知道,您仍在使用 Spring 的确切原因是什么?自从 Java EE 6 中的新 CDI API 和 Java EE 5 中的新 EJB API 以来,它的 DI 和服务优势几乎消失了。

标签: spring jsf-2 managed-bean


【解决方案1】:

@Component 是 Spring 特定的注解,用于由 Spring 管理 bean。 @ViewScoped 是特定于 JSF 的注释,用于指定 JSF 托管 bean @ManagedBean 的范围。 JSF 特定范围注释根本不适用于 Spring 托管 bean。您应该改用 Spring 特定的 @Scope 注释。

所以,要么只通过 JSF 管理 bean:

@ManagedBean
@ViewScoped

homegrow Spring“视图”范围(这不是 Spring 中可用的默认范围之一):

@Component
@Scope("view")

【讨论】:

  • 好的,我明白了,但是当我将“@ViewScoped”与“@Component”一起使用时,它的行为会是什么?目前它根本不会重新创建自己并将数据保存在客户端直到tomcat重新启动,它是否类似于会话范围或其他东西?
  • 它将使用默认的 Spring 范围,即“应用程序”。
  • 使用视图范围的自定义实现后,我的服务实现出现 NotSerializable 异常,我必须全部更改吗?
  • Spring 服务确实不可序列化。我不知道为什么不,春天是超越我的。我们只是使用基本上注入可序列化代理的 EJB,我们从来没有遇到过这种问题。随意向 Spring 家伙提出一个新问题,也许他们可以解释它,甚至提出可行的解决方法/解决方案。
  • java.io.NotSerializableException: org.springframework.dao.support.PersistenceExceptionTranslationInterceptor
猜你喜欢
  • 2012-08-31
  • 2013-05-23
  • 1970-01-01
  • 2011-12-23
  • 2012-12-18
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多