Ответ 1
JSF по дизайну игнорирует все пользовательские атрибуты при рендеринге HTML. Вам нужен собственный рендерер. Это в случае PrimeFaces <p:autoComplete>
(и всех других компонентов), к счастью, относительно просто. Это достаточно, чтобы переопределить только метод renderPassThruAttributes()
, в котором вы добавляете новый атрибут, который вы хотите отобразить, в аргумент attrs
и, наконец, делегируете супер-метод.
например.
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);
}
}
Чтобы запустить его, зарегистрируйте его следующим образом в 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>
(вы можете узнать семейство компонентов и тип визуализатора, посмотрев исходный код класса AutoComplete
, они указаны как константы COMPONENT_FAMILY
и RENDERER_TYPE
)
Нет, аннотация @FacesRenderer
просто не будет работать, если целью является переопределение пользовательских рендерингов, которые уже зарегистрированы в faces-config.xml
.