Создание taglib.xml с TagHandler делает аннотированные пользовательские компоненты не работающими

В качестве упражнения я создаю некоторые пользовательские компоненты в jsf 2.2, используя только аннотации. На данный момент я не заинтересован в taglib для завершения в пользовательском интерфейсе, и, поскольку это освобождает меня от необходимости поддерживать его, начальная разработка происходит быстрее. Это все работает отлично. В этом примере у меня есть один компонент, который на данный момент расширяет PrimeFaces InputText (изменение, которое не имеет значения), чистую конфигурацию лиц (правильно с пространством имен 2.2) и простую страницу

составная часть:

package my.custom.xforms;

import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.FacesComponent;

import org.primefaces.component.inputtext.InputText;

@FacesComponent(value = "xforms.input", createTag = true,
    namespace =  "http://www.w3.org/2002/xforms", tagName = "input")
@ResourceDependencies({
    @ResourceDependency(library="primefaces", name="primefaces.css"),
    @ResourceDependency(library="primefaces", name="jquery/jquery.js"),
    @ResourceDependency(library="primefaces", name="primefaces.js")}
)
public class Input extends InputText {

    public Input() {
        setRendererType("xforms.inputRenderer");
    }

    @Override
    public String getFamily() {     
        return "my.xforms.components";
    }
}

Лица-config.xml

<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">
</faces-config>

страница

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:xf="http://www.w3.org/2002/xforms"
    xmlns:p="http://primefaces.org/ui">
    <h:head/>
    <h:body>
        <xf:input />
    </h:body>
</html>

Это хорошо показывает ввод текста 'PrimeFaces'.

В качестве упражнения я добавил тег, который определяет модель (внутреннюю по отношению к "моему" движку), которая не взаимодействует с пользовательским интерфейсом. Поэтому я подумал о том, чтобы добавить TagHandler (он не должен манипулировать тегами перед этим, поэтому, возможно, мне следует просто расширить UIComponentBase, но это не "проблема" сейчас). TagHandlers не могут быть созданы с помощью аннотаций из того, что я вижу, поэтому я создал taglib.xml и поместил туда только мой TagHandler.

taghandler

package my.custom.xforms;

import java.io.IOException;

import javax.el.ELException;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.view.facelets.ComponentHandler;
import javax.faces.view.facelets.FaceletContext;
import javax.faces.view.facelets.FaceletException;
import javax.faces.view.facelets.TagConfig;
import javax.faces.view.facelets.TagHandler;

public class ModelTagHandler extends TagHandler {

    public ModelTagHandler(TagConfig tagConfig) {
        super(tagConfig);
    }

    public void apply(FaceletContext faceletContext, UIComponent parent) throws IOException, FacesException, FaceletException, ELException {
        if (ComponentHandler.isNew(parent)) {
            System.out.println("XForms Model encountered");
        }
    }
}

новая страница

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:xf="http://www.w3.org/2002/xforms"
    xmlns:p="http://primefaces.org/ui">
    <h:head/>
    <h:body>
        <xf:model /> <!-- can be put in h:head to, does not make a difference -->
        <xf:input />
    </h:body>
</html>

TagLib

<facelet-taglib version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee   http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
    <namespace>http://www.w3.org/2002/xforms</namespace>

    <tag>
        <tag-name>model</tag-name>
        <handler-class>my.custom.xforms.ModelTagHandler</handler-class>
    </tag>
</facelet-taglib>

К моему удивлению (ну, отчасти), мой пользовательский компонент, созданный только с аннотациями, перестал работать со следующей ошибкой.

/components/page.xhtml @12,33 <xf:input> Tag Library supports namespace: http://www.w3.org/2002/xforms, but no tag was defined for name: input

Это только начало работать снова, если я поместил пользовательский компонент в моем taglib.

<tag>
    <tag-name>input</tag-name>
    <component>
        <component-type>xforms.input</component-type>
        <renderer-type>xforms.inputRenderer</renderer-type>
    </component>
</tag>

Это ожидаемое поведение? Или тег-обработчик должен быть объявлен по-другому? Я пробовал много комбинаций ключевых слов в Google, но безрезультатно. Не найдя ни ошибки, ни намека на то, что все по-другому, ничего.

В настоящее время я запускаю все это в

  • Wildfly 8.0.0-Final (Мохарра 2.2.5-jbossorg-3 20140128-1641)
  • java7
  • PrimeFaces 5.1
  • OmniFaces 2.0.

Я попытаюсь запустить его на более новом WildFly завтра или просто попробую обновить его до последней Мохарры (возможно, в чистом Tomcat или что-то в этом роде).

0 ответов

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