【问题标题】:Accessing session bean data in constructor of JSF managed bean在 JSF 托管 bean 的构造函数中访问会话 bean 数据
【发布时间】:2023-03-03 22:47:01
【问题描述】:

我正在尝试访问托管 bean 构造函数中的会话 bean 数据。为此,我使用@ManagedProperty 注释如下。当我尝试在构造函数中访问时,它会给出java.lang.NullPointerException,并且可以在另一个函数中访问同一段代码。可能我需要为构造函数做一些不同的事情。有人可以指导我做什么。

@ManagedProperty(value="#{sessionBean}")
private SelectCriteriaBean sessionData; 

// This is contructor
public ModifyBusinessProcessBean() {
  logger.debug(getSessionData().getSelectedBusinessProcessLevelZero());     
}

// Another Function where the same code doesn't give error
public anotherFunction() {
  logger.debug(getSessionData().getSelectedBusinessProcessLevelZero());     
}

【问题讨论】:

    标签: jsf-2 managed-bean managed-property


    【解决方案1】:

    您不应该在构造函数中使用@ManagedProperty,因为它尚未设置。首先创建托管 bean 时,会调用其构造函数,然后使用 setter 设置托管属性。您应该使用带有 @PostConstruct 注释的方法,因为它是在设置属性后调用的:

    @PostConstruct
    public void init() {
      logger.debug(getSessionData().getSelectedBusinessProcessLevelZero());
    }
    

    【讨论】:

    • 哈!并发在行动:)
    【解决方案2】:

    这是预期的行为。

    @PostConstruct 方法在 bean 的构造和依赖注入(例如 @ManagedProperty)发生后立即执行。所以你的依赖在构造函数中根本不可用。

    使用@PostConstruct注释方法并引用您的依赖项需要做的是标准方式:

    @PostConstruct
    public void init() {
        injectedDependency.performOperation();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 2013-07-04
      • 2013-01-05
      • 2011-12-05
      • 2012-04-29
      • 2012-12-26
      相关资源
      最近更新 更多