Не удается получить значение из компонента ADF в файле DownloadActionListener

Я столкнулся с проблемой, для которой я не смог найти никакого разрешения... У меня есть компонент selectManyChoice, подобный этому:

<af:selectManyChoice value="#{bindings.my_VO1.inputValue}" 
                     label="myLabel" id="smc1"
                     binding="#{pageFlowScope.myBean.myMultiSelection}"
                     autoSubmit="true">
  <f:selectedItems value="#{bindings.my_VO1.items}" id="si1"/>
</af:selectManyChoice>

Для получения значений я тестировал с помощью 2 таких кнопок:

<af:commandButton text="First Button" 
                  id="cb1" 
                  action="#{pageFlowScope.myBean.saveSelection}>
  <af:fileDownloadActionListener method="#{pageFlowScope.myBean.exportReport}"/>
</af:commandButton>

А также:

<af:commandButton text="Second Button" 
                  id="cb2" 
                  action="#{pageFlowScope.myBean.saveSelection}/>

Вторая кнопка может успешно получить выбранные значения и распечатать их на экране. Однако первая кнопка не могла. Это всегда вызывало исключение NullPointerException, когда я пытался вызвать myMultiSelection.getValue() в этой строке кода:

public String saveSelection() {
    if (myMultiSelection.getValue() != null) {

Единственная разница между ними — тег fileDownloadActionListener. Интересно, влияет ли этот тег на внутреннюю работу первой кнопки... Однако мне все еще нужен этот тег, поскольку цель кнопки - создать файл PDF на основе выбранных значений и загрузить этот файл в браузере. . Может ли кто-нибудь указать мне правильное направление?


person hoangbv15    schedule 05.11.2012    source источник
comment
Не уверен, правильно вы скопировали или нет, но вы забываете закрытие в своих действиях.   -  person User404    schedule 05.11.2012


Ответы (1)


Вы можете попробовать это следующим образом: используйте свою вторую кнопку и в его прослушивателе действий вы просто вызываете файл DownloadActionListener. Таким образом, вы точно знаете, правильно ли выбрано значение.

Пример. .html

Редактировать: вместо использования JS для вызова прослушивателя действий вы можете сделать это следующим образом:

Добавьте их на свою страницу:

<af:commandButton text="Hidden Button" binding="#{pageFlowScope.myBean.btnHiddenButton}"
                  id="cb1" visible="false">
  <af:fileDownloadActionListener method="#{pageFlowScope.myBean.exportReport}"/>
</af:commandButton>

<af:commandButton text="Visible Button" 
                  id="cb2" 
                  action="#{pageFlowScope.myBean.saveSelection}/>

Затем в вашем bean-компоненте перейдите к методу saveSelection и сделайте что-нибудь, чтобы получить правильные данные. После этого добавьте это:

ActionEvent event = new ActionEvent(btnHiddenButton);
event.queue();  

Это активирует скрытую кнопку, не нажимая ее. (убедитесь, что у вас есть привязка, конечно)

person User404    schedule 05.11.2012
comment
Я попробовал ваше решение, и оно сработало. Интересно, повлияет ли использование javascript для чего-то столь простого, как это, на производительность системы или нет? Нет ли другого способа использовать собственные библиотеки ADF для достижения того же результата? - person hoangbv15; 06.11.2012
comment
Не совсем, так как он только активирует прослушиватель действий. - person User404; 06.11.2012
comment
@ hoangbv15 Посмотрите отредактированное решение. Вы должны быть в состоянии избежать JS со вторым методом. - person User404; 06.11.2012