ManagedProperty不可用

普里尔

我有两个ManagedBeans(SessionHandler和OrderHandler)。两者都是会话范围的。

SessionHandler:

@ManagedBean(name="session")
@SessionScoped
public class SessionHandler {

    private Account account;

    public String login() {
        try {
            // ... login method ...

            return("bookinglist.xhtml?faces-redirect=true");
        }
        catch (Exception e) {
            // ... exception handling ...
        }
    }

    // ... getter & setter ...
}

OrderHandler:

@ManagedBean(name="order")
@SessionScoped
public class OrderHandler {

    @ManagedProperty(value="#{session.account}")
    Account account; // getter and setter

    public OrderHandler() {
        this.createList();
    }

    private void createList() {
        // method creates an ArrayList of bookings
        // it uses this.account.getId() for a SQL statement
    }
}

我想bookinglist.xhtml中显示欢迎文本和我的列表:

<p>Welcome, #{sessions.account.name}!</p>

<ui:repeat value="#{order.bookingList}" var="item">
    <!-- ... items ... --->
</ui:repeat>

显示欢迎文本,但是我的列表为空,因为在我的sql语句中accountID为null。例如,accountID = 1的语句有效。在预订过程的后期,我可以使用accountID(无需做任何声明或覆盖)。

我想问题是,该属性在登录后无法立即使用...但是我不知道为什么。有人能帮我吗?

0

使用时@ManagedProperty,要记住的一个重要事实是,调用bean构造函数之后,将注入一次这样的属性原因是因为JSF仅在完全构造bean时才能注入属性。

实际上,这意味着从您当前的代码开始,account将在createList()调用之后注入如果您调试OrderHandler,很可能会看到以下执行顺序:

// bean instantiation step
-> OrderHandler constructor called
   -> createList called

// bean property injection step
-> Account injected

为了解决这个问题,您需要createList()在构造函数完成并且account已经注入之后调用您可以使用带有@PostConstruct注释的方法来实现

@PostConstruct
private void init() {
    // this will be called after constructor call, and property injection
    this.createList();
}

您可以@PostConstruct在此处阅读有关注释的更多信息

http://docs.oracle.com/javaee/7/api/javax/annotation/PostConstruct.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章