Пользовательские теги приводит к появлению MethodNotFoundException

То, что я хочу сделать, это объявить общий заголовок данных как составной компонент. Но этот ответ дал мне понять, так как он не был представлен:

Как создать составной компонент для столбца с данными?

По сути, он дал мне указание попробовать мой собственный taglib, и это работает очень хорошо, за исключением того, что в моем заголовке есть ссылка, которая делает reRender. Когда эта ссылка нажата, MethodNotFoundException выбрасывается.

Это мой пользовательский taglib:

<?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://stackrudummy.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}"

У этого компонента есть метод, который вызывается с помощью сигнатуры String sort(); и это работает очень хорошо, если я просто определю это и пропущу, используя свой собственный тег. Однако с тегом все работает, кроме метода действия...

1 ответ

Решение

Спецификация JavaBean предоставляет несколько способов вызова метода. На самом деле, вы можете назвать действие обычным способом #{actionBean.actionMethod}но и путь #{actionBean['actionMethod']},

Действие сортировки, которое вы даете, передается как MethodExpressionпо сравнению с ValueExpressionЭто дало мне проблемы в некоторых средах JSF.

То, что я хотел бы, чтобы вы попробовали testwise, - это задание действия в виде двух отдельных (значений) параметров:

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

и назвать тех, кто в шаблоне как #{sortActionBean['sortActionMethod']}, Хорошая статья на эту тему - Передача тегов методов действий.

Надеюсь, поможет...

Другие вопросы по тегам