Я разрабатываю компонент, содержащий поведение клиента AJAX. Поведение зависит от параметров, предоставляемых компоненту (например, для рендеринга и выполнения целей). Из-за особенностей производительности я не хочу реализовывать компонент с использованием композитных компонентов на основе facelet.JSF: Когда добавлять ClientBehavior к собственному компоненту
Мой вопрос в том, когда поведение клиента должно быть добавлено к компоненту. Если я позвоню addClientBehavior()
в методе encodeBegin()
, я получаю NullPointerException
в UIComponentBase.restoreBehaviorsState()
. Если я добавлю поведение во время построения, выполняется запрос ajax, однако параметры еще не доступны. Есть ли подходящий метод или событие, когда нужно правильно добавлять поведение?
Я использую mojarra 2.1.7. Ниже приведен краткий пример моего компонента без динамического материала АЯКС:
@FacesComponent(value="simpleTestLink")
public class SimpleTestLink extends HtmlCommandLink{
private Logger logger=LoggerFactory.getLogger(getClass());
private AjaxBehavior ajax;
enum PropertyKeys{aProp};
public SimpleTestLink() {
logger.debug("SimpleTestLink created");
// adding ajax here works, but no parameters available yet
ajax = new AjaxBehavior();
ajax.setExecute(Arrays.asList(new String[]{"@this"}));
ajax.setRender(Arrays.asList(new String[]{"@form"}));
addClientBehavior(getDefaultEventName(), ajax);
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
logger.debug("encodeBegin num: " + getAttr());
// adding ajax here fails
super.encodeBegin(context);
}
@Override
public boolean getRendersChildren() {
return true;
}
@Override
public void encodeChildren(FacesContext context) throws IOException {
Object attr = getAttr();
HtmlOutputText outputText = new HtmlOutputText();
outputText.setValue("testlink["+ attr+"]\n");
outputText.encodeAll(context);
super.encodeChildren(context);
}
private Object getAttr() {
return getAttributes().get(PropertyKeys.aProp.name());
}
}
Спасибо за любую помощь,
Jens