Создание 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 или что-то в этом роде).