没有构建托管bean

时间:2013-01-04 09:54:46

标签: jsf jsf-2 managed-bean

当我点击页面时,我的JSF托管bean没有构建。

这是我的面孔:

            <h:dataTable value="#{productsBean.producten}" var="product">
                <h:column>#{product.description}</h:column>
                <h:column>#{product.price}</h:column>
                <h:column>#{product.categoryName}</h:column>
                <h:column>
                    <h:link value="Edit" outcome="/products/edit">
                        <f:param name="id" value="#{product.product_id}"/>
                    </h:link>
                </h:column>


            </h:dataTable>

这是我的ProductsBean:

@ManagedBean(eager=true)
@RequestScoped
public class ProductsBean implements Serializable{

    private List<ProductBean> producten; //+getter
    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;

    public ProductsBean() {

        Store store = applicationBean.getStore();

        for (String c : store.getCategories()) {
            for(be.kdg.shop.model.stock.Product p : store.getProductsOfCategory(c)){
                ProductBean product = new ProductBean();
                product.setProduct_id(p.getProduct_id());
                product.setDescription(p.getDescription());
                product.setCategoryName(p.getCategoryName());
                product.setPrice(p.getPrice());
            producten.add(product);
            }

        }
....

当我使用“#{productsBean.producten}”时,我的JavaBean应该初始化,但事实并非如此。 当我调试我的代码时,我没有到达构造函数。

2 个答案:

答案 0 :(得分:1)

  

我还看到了原始的JSF源代码。

您的HTTP请求根本没有点击FacesServlet。它是负责执行所有JSF工作的人,例如创建托管bean和生成HTML。

您应确保您的HTTP请求网址与webapp <url-pattern>中配置的FacesServlet的{​​{1}}相匹配。如果是web.xml,那么您应该按*.jsf而不是/products.jsf打开页面。

或者,您也可以将/products.xhtml的{​​{1}}更改为<url-pattern>,这样您就无需使用虚拟网址。以前在JSF 1.x中,这曾经最终在每次调用自身的无限循环中结束,但是由于JSF 2.x这种情况不再发生并且应该可以正常工作。

FacesServlet

另见:

答案 1 :(得分:0)

首先,(eager = true)仅适用于@ApplicationScoped托管bean,并且意味着在应用程序初始化时将创建bean,因此在这种情况下,您应该删除它。

我建议您检查一下producten属性是否有getter方法,因为您没有在代码中指定它。您也可以尝试使用@ViewScoped等其他范围。