与元素类型 "p:dataList" 关联的属性 "pt:data-inset" 的前缀 "pt" 未绑定

The prefix "pt" for attribute "pt:data-inset" associated with an element type "p:dataList" is not bound

我有以下 Primefaces 页面和控制器。

页数

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:pm="http://primefaces.org/mobile">

<f:view renderKitId="PRIMEFACES_MOBILE"/>

<h:head>

</h:head>

<h:body id="body">

    <pm:page id="page">
        <pm:header title="MyProduct">
        </pm:header>

        <pm:content id="content">
            <p:dataList value="#{likeditems.likedItems}" var="item" pt:data-inset="true" paginator="true" rows="5">
                <f:facet name="header">
                    List of Cars
                </f:facet>
                <h:outputLink value="#{item.url}">
                    <h2>#{item.title}</h2>
                    <p>#{item.price}</p>
                    <p class="ui-li-aside"><strong>XXXX</strong></p>
                </h:outputLink>
                <f:facet name="footer">
                    List of Cars
                </f:facet>
            </p:dataList>
            <p:outputLabel
                    id="priceHint"
                    value="..."
                    cache="false"/>
        </pm:content>

        <pm:footer title="m.MyProduct.info"></pm:footer>
    </pm:page>
</h:body>

</html>

控制器

@ManagedBean(name = LikedItemsView.NAME)
@SessionScoped
public class LikedItemsView {
    public static final String NAME = "likeditems";

    public List<LikedItem> getLikedItems()
    {
        final LikedItem item1 = new LikedItem();
        item1.setTitle("Product 1");
        item1.setPrice(Money.of(CurrencyUnit.USD, 20));
        item1.setUrl("http://google.com");

        final LikedItem item2 = new LikedItem();
        item2.setTitle("Product 2");
        item2.setPrice(Money.of(CurrencyUnit.USD, 30));
        item2.setUrl("http://yandex.ru");

        final List<LikedItem> items = new LinkedList<LikedItem>();
        items.add(item1);
        items.add(item2);

        return items;
    }
}

当我访问该页面时,出现以下错误:

servlet.ServletException: Error Parsing /likeditems.xhtml: Error Traced[line: 31] The prefix "pt" for attribute "pt:data-inset" associated with an element type "p:dataList" is not bound.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)

第 31 行是这样的:

<p:dataList value="#{likeditems.likedItems}" var="item" pt:data-inset="true" paginator="true" rows="5">

我该如何解决这个错误?

应该是data-inset而不是pt:data-inset

<p:dataList>. Moreover, all attribute names prefixed with data-* are most definitely HTML5 related 本身不支持 data-inset 属性。因此,按照其他人的建议删除 pt 前缀不是正确的解决方案。根本不会呈现该属性。您也可以完全删除整个属性。

XML 命名空间前缀 pt 建议 shorthand 用于 "passthrough" 并且该属性在此特定代码段中可识别为直通属性。这是 JSF 2.2 的特定功能,是“HTML5 friendly markup”的一部分。

正确的 XML 名称空间 URI 是 http://xmlns.jcp.org/jsf/passthrough

<html ... xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">

请注意官方的 XML 命名空间前缀是 p(另请参阅该教程),但它与 PrimeFaces 的前缀冲突。我个人会用a,代表"attribute"。

<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<p:dataList ... a:data-inset="true">

如果您不使用 JSF 2.2,或者在客户端对该属性没有任何用处,那么,完全删除它。它显然是复制粘贴代码的剩余部分。