2012-04-16 4 views
1

Я разрабатываю компонент, содержащий поведение клиента 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

ответ