【问题标题】:Managed bean is not constructed未构造托管 bean
【发布时间】:2012-12-18 18:05:54
【问题描述】:

当我点击页面时,我的 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 应该被初始化,但它没有。 当我调试我的代码时,我没有到达构造函数。

【问题讨论】:

  • 在浏览器中右键单击页面并执行查看源代码。你看到了什么?您看到的是 JSF 生成的 HTML 代码,还是仍然看到原始的 JSF 源代码?
  • 我看到的仍然是原始 JSF 源代码。
  • 我发布了一个答案。我还在问题中将您过于笼统的术语“javabean”编辑为更特定于 JSF 的“托管 bean”。普通的 Java EE Web 应用程序中有很多不同种类的 javabean。

标签: jsf jsf-2 managed-bean


【解决方案1】:

我看到的仍然是原始的 JSF 源代码。

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

您应该确保您的 HTTP 请求 URL 与 webapp 的 web.xml 中配置的 FacesServlet&lt;url-pattern&gt; 匹配。如果是*.jsf,那么你应该用/products.jsf打开页面,而不是/products.xhtml

或者,您也可以将FacesServlet&lt;url-pattern&gt; 更改为*.xhtml,这样您就无需摆弄虚拟URL。以前在 JSF 1.x 中,这曾经以每次调用自身的无限循环结束,但从 JSF 2.x 开始,这种情况不再发生,应该可以正常工作。

<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

另见:

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 2023-03-03
      • 2013-11-30
      • 2011-08-05
      • 2013-07-04
      • 2013-07-15
      相关资源
      最近更新 更多