1

ページにアクセスしたときに、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は初期化されるはずですが、そうではありません。コードをデバッグすると、コンストラクターに到達しません。

4

2 に答える 2

1

まだ生のJSFソースコードが表示されます。

HTTPリクエストはまったくヒットしませんでしたFacesServlet。これは、マネージドBeanの作成やHTMLの生成などのすべてのJSF作業を実行する責任があります。

HTTPリクエストURLがwebappで設定されている<url-pattern>のと一致することを確認する必要があります。たとえば、の場合は、の代わりにでページを開く必要があります。FacesServletweb.xml*.jsf/products.jsf/products.xhtml

<url-pattern>または、のFacesServletをに変更するだけで*.xhtml、仮想URLをいじる必要がなくなります。以前のJSF1.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>

参照:

于 2013-01-04T11:46:06.693 に答える
0

まず、(eager = true)は@ApplicationScopedマネージドBeanでのみ機能し、アプリケーションの初期化時にBeanが作成されることを意味するため、この場合は削除する必要があります。

コードで指定していないため、producten属性にgetterメソッドがあることを確認することをお勧めします。また、のような他のスコープで試すこともできます@ViewScoped

于 2013-01-04T10:17:11.197 に答える