【问题标题】:Custom taglib results in MethodNotFoundException自定义 taglib 导致 MethodNotFoundException
【发布时间】:2014-02-05 10:12:17
【问题描述】:

我想要做的是将一个通用的数据表头声明为一个复合组件。但是这个答案让我直截了当,因为它没有被渲染:

How to create a composite component for a datatable column?

基本上,它指示我尝试我自己的 taglib,而且效果非常好,只是我的标题中有一个重新渲染的链接。按下此链接时会抛出 MethodNotFoundException。

这是我的自定义标签库:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://stackoverflowdummy.com/dumb/components</namespace>
    <tag>
        <tag-name>tableHeader</tag-name>
        <source>tags/tableHeader.xhtml</source>
        <attribute>
            <description></description>
            <name>value</name>
        </attribute>
        <attribute>
            <description>The listener that handles sorting</description>
            <name>sortAction</name>
            <method-signature>java.lang.String action()</method-signature>
        </attribute>
        <attribute>
            <description>The property that holds the current id to sort on
            </description>
            <name>sortValue</name>
        </attribute>
        <attribute>
            <description>The component that needs to be updated after changes
            </description>
            <name>reRender</name>
        </attribute>
    </tag>
</facelet-taglib>

我尝试不使用方法签名,也尝试删除“动作”。我的 web.xml 确实包含这样的 taglib:

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/cc.taglib.xml</param-value>
</context-param>

我也尝试过使用“facelets.LIBRARIES”,但没有任何区别。

            <h:commandLink value="#{o.label}" action="#{sortAction}" immediate="true" reRender="#{reRender}">
                <f:setPropertyActionListener target="#{sortValue}" value="#{o.column.sortId}" />
            </h:commandLink>

最终用途定义如下:

sortAction="#{myBean.sort}"

该 bean 有一个使用签名 String sort(); 调用的方法;如果我只是定义它并跳过使用我自己的标签,它会非常有效。然而,除了 action 方法之外,一切都适用于标签...

【问题讨论】:

标签: jsf-2 primefaces facelets myfaces methodexpression


【解决方案1】:

JavaBean 规范提供了多种调用方法的方法。实际上,您可以通过正常方式#{actionBean.actionMethod} 调用动作,也可以通过#{actionBean['actionMethod']} 方式调用动作。

您提供的排序操作以MethodExpression 的形式传输,而ValueExpressions 在某些JSF 环境中给我带来了问题。

我希望您尝试一下 testwise,将操作作为两个单独的(值)参数:

  • sortActionBean="#{myBean}"
  • sortActionMethod="sort"

并将模板中的那些称为#{sortActionBean['sortActionMethod']}。关于这个主题的一篇好文章是Passing action methods facelets tags

希望对你有帮助...

【讨论】:

  • 它按预期工作,谢谢。实际上我不介意强制执行排序方法名称,所以我只需将 bean 绑定到我的自定义组件,然后从那里 #{bean.sort}。它有效。
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多