所以我有一个bean,ItemHolder,我在其中定义了一个@PostConstruct方法:
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class ItemHolder {
private List<Item> items;
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
@PostConstruct
private void init() {
items = new ItemList().getItems(); // returns list of items
}
}
然而,当我尝试在我的xhtml文件中显示值时,我收到“HTTP状态500 - 在托管bean itemHolder上执行资源注入时出错”消息:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<h:title></h:title>
</h:head>
<h:body>
<h1>Welcome to the shop #{login.username}.</h1>
#{itemHolder.items.get(0)};
</h:body>
</html>
但是,当我将bean中的@PostConstruct方法更改为以下内容时:
@PostConstruct
private void init() {
items = new ArrayList<Item>();
items.add(new Item(302, "Name", "URL", 3000, 50, "Description"));
}
然后我没有错误,输出在我的xhtml页面中显示得很好。
我在第一个@PostConstruct中调用的getItems()方法确实抛出了一些异常,但异常是在该方法中处理的,而不是@PostConstruct,所以我不认为这不重要。尽管如此,它还需要大约5秒的时间来处理。不确定这是不是一个问题。除此之外,它的工作正常,而不是JSF和PostConstruct-annotation。