JSF por diseño ignora todos los atributos personalizados al representar HTML. Necesitas un renderizador personalizado. Esto es en el caso de PrimeFaces <p:autoComplete>
(y todos los demás componentes) afortunadamente relativamente simple. Es suficiente anular solo el método renderPassThruAttributes()
en el que agrega el nuevo atributo que desea representar en el argumento attrs
y finalmente delega en el método super.
E.g.
package com.example;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.primefaces.component.autocomplete.AutoCompleteRenderer;
public class MyAutoCompleteRenderer extends AutoCompleteRenderer {
@Override
protected void renderPassThruAttributes(FacesContext facesContext, UIComponent component, String[] attrs) throws IOException {
String[] newAttrs = new String[attrs.length + 1];
System.arraycopy(attrs, 0, newAttrs, 0, attrs.length);
newAttrs[attrs.length] = "x-webkit-speech";
super.renderPassThruAttributes(facesContext, component, newAttrs);
}
}
Para conseguir que se ejecute, lo registra como sigue en su webapp faces-config.xml
:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.AutoCompleteRenderer</renderer-type>
<renderer-class>com.example.MyAutoCompleteRenderer</renderer-class>
</renderer>
</render-kit>
(se puede averiguar la familia y procesador de tipo de componente de mirar el código fuente de AutoComplete
clase , que están especificados como COMPONENT_FAMILY
y RENDERER_TYPE
constantes de allí)
No, la anotación simplemente @FacesRenderer
no funcionará cuando el propósito es anular los renderizadores personalizados que ya están registrados en un faces-config.xml
.
echar un vistazo a este http://stackoverflow.com/a/6675592/617373 – Daniel