我有两个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(无需做任何声明或覆盖)。
我想问题是,该属性在登录后无法立即使用...但是我不知道为什么。有人能帮我吗?
使用时@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] 删除。
我来说两句