Программно добавляя Ajax Behavior - «Мохарра не определена»

У меня есть страница с использованием динамических форм, где я создаю дерево компонентов программно (что не обсуждается в этом вопросе). Для некоторых элементов управления вводом, которые мне нужно отобразить, требуется обработчик ajax.

Фрагмент xhtml (включенный<ui:include> из другого фрагмента) это:

<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://xmlns.jcp.org/jsf/passthrough">

    <h:panelGroup id="id_Group1" binding="#{questionaire.group1}" layout="block"/>

</ui:composition>

Основываясь на других SO anwsers, у меня есть следующий код компонента:

   public HtmlPanelGroup getGroup1() {

        // irrelevant code omitted

        HtmlSelectOneRadio selectUI = new HtmlSelectOneRadio();
        AjaxBehavior valueChangeAction = (AjaxBehavior)FacesUtils.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);

        valueChangeAction.addAjaxBehaviorListener(new ProbeQuestionListener(currentQuestion, "probeDiv" + questionNumber));


        selectUI.addClientBehavior("change", valueChangeAction);
        valueChangeAction.setRender(Collections.singletonList("probeDiv" + questionNumber));

       // further code to customise the control, create the panel group and probe div and wire everything together omitted
    }

Это делает правильно, и я вижу:

<input type="radio" onchange="mojarra.ab(this,event,'change',0,'probeDiv2')" value="0" id="answer_1:0" name="answer_1">

Тем не менее, нажатие переключателя дает мне ошибку консоли JavaScript:reference error: mojarra is not defined

Теперь, если я изменю xhtml, чтобы включить «нормальный» элемент управления ajax, например,

<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://xmlns.jcp.org/jsf/passthrough">

    <h:panelGroup id="id_Group1" binding="#{questionaire.group1}" layout="block"/>

    <!-- include a hacky hidden ajax field to force inclusion of the ajax javascript -->
    <h:panelGroup layout="block" id="hiddenAjaxDiv" style="display:none">
        <h:inputText id="hiddenAjax">
            <f:ajax execute="hiddenAjax" render="hiddenAjaxDiv" />
        </h:inputText>
    </h:panelGroup>    

</ui:composition>

Это работает, и сетевой монитор firebug показывает, что мое приложение ajax от переключателя размещено в приложении.

Итак, наконец, мой вопрос:

Как мне программно форсировать включение библиотеки javascript ajax и обойтись без ужасного хака, который я сейчас использую?

Примечание: меня не интересует какой-либо ответ, который начинается с «не использовать динамически генерируемые компоненты» - по нескольким причинам это не вариант.

Ответы на вопрос(1)

Ваш ответ на вопрос