2014-02-06 3 views
-1

Я вырыл вокруг SO, пытаясь решить эту проблему, и продолжаю находить свой путь назад к сообщению (которое, как мне кажется, не находит снова), где BalusC предоставил список вероятных проблем , но я уже реализовал решения, какие проблемы, похоже, они применили ко мне. Ситуация заключается в том, что внутри моего .xhtml-файла у меня есть команда Primefaces, пытающаяся вызвать поддерживающий метод Bean при установке некоторых свойств bean с помощью f: setPropertyActionListener. Однако метод bean никогда не вызван.p: commandButton не выполняет метод действия

Незначительная часть этой страницы, на которой я работаю, имеет кнопки в другом месте, используя почти идентичный код, и эти кнопки работают нормально.

Нажатие на эту кнопку обновляет страницу, но ничего больше. Некоторая релевантная информация: кнопка находится внутри ui: repeat, которая находится внутри другого ui: repeat, который находится внутри p: dataGrid. Все это содержится внутри формы h:. На странице есть два h: тега формы, однако они не вложены. Эта кнопка находится во второй форме. Кнопки в первой форме работают нормально. Бэк-бэк - ViewScoped.

Я работаю с JSF 2.X и Facelets, а также с использованием Primefaces. Мой сервер Apache Tomcat v7.0.47

Вот Действие Метод:

public final String selectAnswerForRequest() { 
    FacesContext fCtx = FacesContext.getCurrentInstance(); 
    String navString = ""; 
    try { 
     if (chosenAnswer != null && unansweredRequest != null && unansweredRequest.getResponse() != null) { 
      brain.handleResponse(unansweredRequest.getResponse(), chosenAnswer, unansweredRequest); 
      navString = "refresh"; 
     } 
    } catch (BrainException e) { 
     LOGGER.error("Error adding answer", e); 
     fCtx.addMessage(null, buildErrorMessage("hdrFailed", "txtErrorAddingAnswer")); 
    } 
    return navString; 
} 

Все имеет методы получения и установки. Я попытался изменить атрибут action на actionListener и изменил метод действия, чтобы принять событие, но он все еще не работает. Я попытался изменить его с p: на h :. Я попытался сделать его commandLink и h: commandButton.

Edit: Вот это весь .xhtml документ в более очищенном виде:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:p="http://primefaces.org/ui" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:pt="http://xmlns.jcp.org/jsf/passthrough" 
xmlns:encode="http://envisage.com/jsf/encode" 
template="/templates/twocolumn.xhtml"> 

<ui:param name="pageTitle" value="#{msgHome['pageTitle']}" /> 
<ui:param name="pageId" value="pg-home" /> 
<ui:param name="pageDesc" value="#{msgHome['pageDesc']}" /> 

<ui:define name="columnOne"> 

    <h2 class="section-title"> 
     <span class="label label-warning label-icon"><i 
      class="eis-icon-recent"></i></span> #{msgHome['answeredTitle']} 
    </h2> 
    <div id="answered-questions" data-resize="trending-sidebar" 
     data-min-resize="200"> 
     <h:form id="firstform" prependId="false"> 
      <p:dataGrid paginatorPosition="bottom" var="req" 
       value="#{homeBean.answeredQuestions}" rows="5" columns="1" 
       paginator="true" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}" 
       id="renderTarget1"> 
       <p:column> 
        <section> 
         <div> 
          <dl> 
           <ui:repeat var="answer" value="#{req.response.answers}"> 
            <div> 
             <p:commandButton update="@form, :growlForm:growl" 
              ajax="false" value="#{msgHome['highlyBtn']}" 
              action="#{homeBean.markAnswerAsHighlyUseful}"> 
              <f:setPropertyActionListener 
               target="#{homeBean.selectedAnswer}" value="#{answer}" /> 
              <f:setPropertyActionListener 
               target="#{homeBean.selectedRequest}" value="#{req}" /> 
             </p:commandButton> 
             <p:commandButton update="@form, :growlForm:growl" 
              ajax="false" value="#{msgHome['somewhatBtn']}" 
              action="#{homeBean.markAnswerAsSomewhatUseful}"> 
              <f:setPropertyActionListener 
               target="#{homeBean.selectedAnswer}" value="#{answer}" /> 
              <f:setPropertyActionListener 
               target="#{homeBean.selectedRequest}" value="#{req}" /> 
             </p:commandButton> 
             <p:commandButton update="@form, :growlForm:growl" 
              ajax="false" value="#{msgHome['notBtn']}" 
              action="#{homeBean.markAnswerAsNotUseful}"> 
              <f:setPropertyActionListener 
               target="#{homeBean.selectedAnswer}" value="#{answer}" /> 
              <f:setPropertyActionListener 
               target="#{homeBean.selectedRequest}" value="#{req}" /> 
             </p:commandButton> 
            </div> 
            <p:separator /> 
           </ui:repeat> 
          </dl> 
         </div> 
        </section> 
       </p:column> 
      </p:dataGrid> 
     </h:form> 
    </div> 


    <h2> 
     <span class="label label-danger label-icon"><i 
      class="eis-icon-question"></i></span> #{msgHome['unansweredTitle']} 
    </h2> 
    <div id="unanswered-questions" data-resize="moderators-sidebar" 
     data-min-resize="140"> 
     <h:form id="secondForm" prependId="false"> 
      <p:dataGrid paginatorPosition="bottom" var="unansweredReq" 
       value="#{homeBean.unansweredRequests}" rows="5" columns="1" 
       paginator="true" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}" 
       id="renderTarget2"> 
       <p:column> 
        <section> 
         <div> 
          <dl> 
           <p:separator /> 
           <ui:repeat var="match" 
            value="#{unansweredReq.matchingQuestions}"> 
            <ui:repeat var="answers" value="#{match.answers}"> 
             <div> 
              <p:commandButton update="@form, :growlForm:growl" 
               ajax="false" value="#{msgHome['acceptAnsBtn']}" 
               action="#{homeBean.selectAnswerForRequest}" execute="@this"> 
               <f:setPropertyActionListener 
                target="#{homeBean.chosenAnswer}" value="#{answers}" /> 
               <f:setPropertyActionListener 
                target="#{homeBean.unansweredRequest}" 
                value="#{unansweredReq}" /> 
              </p:commandButton> 
              <p:commandButton update="@form, :growlForm:growl" 
               ajax="false" value="#{msgHome['removeAnsBtn']}" 
               action="#{homeBean.removeAnswerFromRequest}" 
               execute="@this"> 
               <f:setPropertyActionListener 
                target="#{homeBean.chosenAnswer}" value="#{answers}" /> 
               <f:setPropertyActionListener 
                target="#{homeBean.unansweredRequest}" 
                value="#{unansweredReq}" /> 
              </p:commandButton> 
             </div> 
             <p:separator /> 
            </ui:repeat> 
           </ui:repeat> 
          </dl> 
         </div> 
        </section> 
       </p:column> 
      </p:dataGrid> 
     </h:form> 
    </div> 

    <h:form id="growlForm"> 
     <p:growl id="growl" showDetail="true" life="5000" 
      severity="info,warn,error" /> 
    </h:form> 

    <h:messages /> 

</ui:define> 

Edit 2: Самое последнее открытие было то, что после удаления верхней половины .xhtml документа (Вся первая h: форма), кнопки в нижней половине начали работать правильно. В настоящее время я пытаюсь использовать эти знания, чтобы узнать, где я могу получить.

+0

Вы отправите полный <форму ... Часть вашего XHTML? Я имею в виду форму и весь код внутри него. –

+0

Хорошо, сначала я не хотел, так как он несколько большой, я разместил половину, содержащую мои неработающие кнопки, а затем половину, содержащую рабочие кнопки. –

+1

Просто скопируйте код в другой проект, а затем обрезайте как можно больше кода, удалив теги/атрибуты/etc, пока проблема все еще проявляется. Как только вы перейдете на этот шаг, проблема исчезнет, ​​сделайте шаг назад, а затем скопируйте весь этот код здесь. Конечно, теги вроде '

' и атрибуты типа' class = "panel-body" 'вообще не играют никакой роли в этой проблеме. См. Также введение http://stackoverflow.com/tags/jsf/info для подсказок по созданию хорошего SSCCE. – BalusC

ответ

0

в вашем DataTable вы используете:

<p:dataGrid paginatorPosition="bottom" var="unansweredReq" 

переменная = "unansweredReq"

, но в вашем:

<f:setPropertyActionListener target="#{homeBean.unansweredRequest}" 
    value="#{unansweredreq}" /> 

значение = "# {unansweredreq}"

Вы используете ee разница (unansweredreq! = unansweredReq)? Я думаю, что jsf этого не принимает. (Я не уверен)

(unansweredreq используется во многих местах в вашем коде)

+0

В то время как я чувствую себя глупо за то, что не хватает этого, я считаю, что это более новая опечатка, так как я несколько раз менял вокруг командной кнопки. Я изменил его обратно на unansweredReq, но действия все еще не выполняются, я считаю, что раньше я их правильно записывал. –

+0

@KyleJennings: ты изменил его во всех местах? проверьте аналогичные другие синтаксические ошибки !. Просто для тестирования удалите рабочую форму и просто дайте проблемную форму и протестируйте ее! –

+0

Я никогда не думал об этом, после удаления верхней половины моя кнопка успешно вызвала метод действия! Поэтому я предполагаю, что это может иметь какое-то отношение к наличию нескольких форм в одном файле. Этот вид открыл еще одну банку червей, но, по крайней мере, это прогресс, благодаря этой идее. –

Смежные вопросы