Почему этот параметр отправляется как Null в моем компоненте?

#java #jsf #ejb-3.0 #primefaces #ejb-3.1

#java #jsf #ejb-3.0 #primefaces #ejb-3.1

Вопрос:

Я использую JSF 2 и EJB 3.1 для создания формы.

Я использую эту часть страницы, чтобы получить некоторые данные, поэтому я могу передать их своему компоненту, используя confirmDialog чуть ниже

 <p:column headerText="#{bundle.edit}" style="width:10px; overflow:visible;">  
    <p:rowEditor/>                            
</p:column>
<p:column headerText="#{bundle.delete}" style="width:10px; overflow:visible;">
    <p:commandButton update=":form" oncomplete="confirmation.show()" 
                     image="ui-icon ui-icon-close" title="Delete">  
        <f:param value="#{user}" name="userAction" />
    </p:commandButton>  
</p:column>
</p:dataTable>

<p:confirmDialog message="Are you sure? user:#{param['userAction']} " width="500"  
                    header="Confirm" severity="alert" widgetVar="confirmation">  
    <p:commandButton value="Yes sure" update=":form" 
              actionListener="#{userController.deleteAction(param['userAction'])}"
              oncomplete="confirmation.hide()" />  
    <p:commandButton value="Not yet" onclick="confirmation.hide()" type="button" />  

</p:confirmDialog>

</h:form>
  

И это компонент, который должен его получить

 @Named(value = "userController")
@Stateful
@RequestScoped
@TransactionManagement(TransactionManagementType.CONTAINER)
public class UserController implements Serializable {

    private User current;

    @Inject
    private br.com.cflex.itm.dataaccess.UserFacade userFacade;

    public UserController() {
    }

    public void deleteAction(User user) {
        userFacade.remove(user);
    }
  

Но мой компонент получает null только как User, и в диалоговом окне я печатаю данные, чтобы я мог видеть, что там выбран объект User.

Почему я получаю null в своем компоненте?
Что не так в передаче подобных параметров?Потому что они теряются при обмене данными между клиентом и сервером…

Ответ №1:

 <p:commandButton action="#{userController.deleteAction(param['userAction'])}" />
  

Значение EL action actionListener ) вычисляется при отправке формы, а не при отображении формы. Параметры запроса ограничены областью запроса и отсутствуют в последующем запросе формы отправки. Вам нужно передать его вместе:

 <p:commandButton action="#{userController.deleteAction(param['userAction'])}">  
    <f:param name="userAction" value="#{param['userAction']}" />
</p:commandButton>
  

Значение EL <f:param> вычисляется при отображении формы. Таким образом, он будет присутствовать в сгенерированном HTML, и JavaScript позаботится о том, чтобы он был передан.

Обратите внимание, что параметры запроса имеют String тип. Ожидание, что они будут User , вообще не будет работать. По сути, он содержит значение User#toString() . Вам нужно будет принять String в качестве аргумента действия и преобразовать его в User себя. Или лучше, используйте <f:viewParam> , в котором вы можете явно указать конвертер.

Комментарии:

1. Спасибо, не знал, что мне также нужно отправить параметр.