【问题标题】:How to invoke BOC code from JSF ManagedBean's constructor?如何从 JSF ManagedBean 的构造函数调用 BOC 代码?
【发布时间】:2012-08-08 23:17:42
【问题描述】:

我有一个 ManagedBean 说 clsA,在这个 clsA 里面有一个 BOC 对象,它将用 DI 填充。如果我想在 clsA 构造过程中调用 BOC,我将在 clsA 构造函数中进行。代码将如下所示:

@ManagedBean(name="clsA") 
public class ClsA {

    private BOC boc;

    public clsA(BOC theBoc) {
       theBoc.doFuncA();
    }

    public String doFuncD() { return ""; }       
 }

Spring 配置会这样:

<bean id="theBoc" class="com.foo.BOC"/>

<bean id="clsA" class="com.foo.clsA">
   <constructor-arg value="theBoc"/>
</bean>

现在我发现了一个问题,如果我在 Spring 配置中声明了 clsA bean,那么我的 JSF bean clsA(与 Spring 配置中的声明同名)将无法工作。这意味着如果我从 JSF 调用 doFuncD(),它不会被调用。如果我删除 clsA Spring 声明,JSF bean clsA 工作正常。

有没有更好的方法从 managedBean ClsA 构造函数调用 BOC?

【问题讨论】:

  • 看起来您正在混合 JSF 和 Spring 的职责。我不做 Spring,我不知道你为什么使用 Spring 那样通过抑制默认构造函数来完全杀死 JSF bean 管理工具,所以我无法回答那部分,但你应该能够使用@PostConstruct 注解在构造和依赖注入之后直接执行逻辑。另请参阅stackoverflow.com/questions/10196982/…
  • 我同意你的看法,这是我的代码设计问题。我真的需要重新考虑一下。

标签: spring jsf-2 dependency-injection managed-bean


【解决方案1】:

我在这个问题上的解决方法是:

  1. 我将删除构造函数代码。不再有构造函数级别的依赖注入。
  2. theBoc.doFuncA(); 从构造函数移动到ClsA 的设置函数。
  3. 从 Spring 配置文件中删除 Spring bean clsA 声明。

这是修改后的代码:

@ManagedBean(name="clsA") 
public class ClsA {

  private BOC boc;

  public clsA(BOC theBoc) {
  }

  public String doFuncD() { return ""; }

  public void setBoc(BOC boc) {
    this.boc = boc;
    theBoc.doFuncA();
  }
}

但是如何确保 setter 只会被调用一次呢?

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多