为什么这个参数在我的Bean中被发送为Null?

时间:2011-10-14 16:28:43

标签: java jsf ejb-3.0 primefaces ejb-3.1

我正在使用JSF 2和EJB 3.1来创建表单。

我正在使用页面的这一部分来获取一些数据,所以我可以使用下面的confirmDialog将它传递给我的bean

<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>

这是应该得到它的Bean

@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);
    }

但我的bean只接收null作为User,而对话框中的我正在打印数据,所以我可以看到在那里选择了一个用户对象。

传递这样的参数有什么不妥?
为什么我的Bean中出现空值?因为它们在客户端和服务器端之间的通信中迷失了......

1 个答案:

答案 0 :(得分:2)

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

action(和actionListener)的EL在提交表单时进行评估,而不是在表单显示时进行评估。请求参数是请求范围的,并且在表单提交的后续请求中不存在。你需要传递它:

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

在显示表单时评估<f:param>的EL。因此,它将存在于生成的HTML中,并且JavaScript将注意它被传递。

请注意,请求参数属于String类型。期待它们User根本不起作用。基本上,它包含User#toString()的值。您需要将String作为操作参数并自行将其转换为User。或者更好的是,使用<f:viewParam>,其中您可以明确指定转换器。