gpt4 book ai didi

JSF/PrimeFaces : programmatic on not firing

转载 作者:行者123 更新时间:2023-12-04 19:53:02 25 4
gpt4 key购买 nike

我们有一个要求,允许用户配置所有数据表中列的顺序,包括上面有操作按钮的列,此处 p:commandButton

因此,我们对必须手动实例化的所有列使用绑定(bind)。对于仅显示一些字符串、 bool 值、日期和数字的所有列,一切正常,但是在添加 p:commandButton 时问题开始了s 到具有一个或多个 <f:setPropertyActionListener> 的列在他们身上。

    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();

CommandButton button = new CommandButton();
button.setIcon( "ui-icon ui-icon-pencil" );
button.setProcess( "@this" );
button.setUpdate( ":compliance-case-dialog :compliance-case-form:data" );
button.setOncomplete( "complianceCaseDialog.show();" );

ValueExpression targetExpression = factory.createValueExpression( elContext, "#{complianceCaseManager.selectedComplianceCaseWithRefresh}", ComplianceCase.class );
ValueExpression valueExpression = factory.createValueExpression( elContext, "#{coca}", ComplianceCase.class );

button.addActionListener( new SetPropertyActionListenerImpl( targetExpression, valueExpression ) );

column.getChildren().add( button ); // add to Column instance

这个按钮“正确地”显示了一个 <p:dialog> , 但应调用 ComplianceCaseManager类' setSelectedComplianceCaseWithRefresh( ComplianceCase selectedComplianceCase )在显示对话框之前使用数据表的当前实体(由 var="coca" 定义)的方法。

<p:dataTable id="data"
widgetVar="resultTable"
value="#{complianceCaseManager.complianceCases}"
var="coca"
...>
</p:dataTable>

调试显示setSelectedComplianceCaseWithRefresh( ComplianceCase selectedComplianceCase )方法永远不会被调用。

问:

怎么了?你如何解决这个问题?

PS:配置为 PrimeFaces 3.4.2、Mojarra 2.1.22、GlassFish 3.1.2.2、Java 7


更新 1:

这是我想转换为程序化的 p:commandButton:

<p:commandButton icon="ui-icon ui-icon-pencil"
title="#{msg['complianceCaseManager.data.edit.button.hint']}"
process="@this"
update=":compliance-case-dialog :compliance-case-form:data"
oncomplete="complianceCaseDialog.show();">
<p:resetInput target=":unlocked-form" />
<f:setPropertyActionListener target="#{complianceCaseManager.selectedComplianceCaseWithRefresh}" value="#{coca}" />
<f:setPropertyActionListener target="#{complianceCaseManager.mode}" value="EDIT" />
</p:commandButton>

线

    <f:setPropertyActionListener target="#{complianceCaseManager.selectedComplianceCaseWithRefresh}" value="#{coca}" />

是我必须去上类的那个。

kolossus 创建的解决方案 MethodExpressionActionListener不适用于我的代码:

    String targetExpressionString = "#{complianceCaseManager.selectedComplianceCaseWithRefresh}";
String valueExpressionString = "#{coca}";

MethodExpression targetMethodExpression = factory.createMethodExpression( elContext, targetExpressionString, null, new Class<?>[]{ ComplianceCase.class } );
MethodExpression valueMethodExpression = factory.createMethodExpression( elContext, valueExpressionString, ComplianceCase.class, new Class<?>[0] );

button.addActionListener( new MethodExpressionActionListener( targetMethodExpression, valueMethodExpression ) );

AFAIK 是为了在目标上调用 setter 并在值上调用 setter,所以我假设 ValueExpression s 就足够了。


更新 2:

尝试通过 EL 2.2 方法调用设置当前实体也不起作用。

代码:

    String methodExpressionString = "#" + "{complianceCaseManager.selectedComplianceCaseWithRefresh(coca)}";
MethodExpression methodExpression = factory.createMethodExpression( elContext, methodExpressionString, null, new Class<?>[]{ ComplianceCase.class } );

button.addActionListener( new MethodExpressionActionListener( methodExpression ) );

没有调用。


更新 3:

这是正确的 <:setPropertyActionListener>代码:

    // traditional <f:setPropertyActionListener target="#{complianceCaseManager.selectedComplianceCaseWithRefresh}" value="#{coca}" />
ValueExpression targetExpression = factory.createValueExpression( elContext, "#{complianceCaseManager.selectedComplianceCaseWithRefresh}", ComplianceCase.class );
ValueExpression valueExpression = factory.createValueExpression( elContext, "#{coca}", ComplianceCase.class );

button.addActionListener( new SetPropertyActionListenerImpl( targetExpression, valueExpression ) );

非常感谢 kolossus。记得调用setId()实例化 PrimeFaces 时 CommandButton .

最佳答案

actionListener 应该创建为 MethodExpression 而不是 ValueExpression :

  1. 我假设 factory instanceOf ExpressionFactory。使用 createMethodExpression factory

    MethodExpression targetExpression = factory.createMethodExpression( elContext, "#{complianceCaseManager.selectedComplianceCaseWithRefresh(coca)}",null,new Class[]{ComplianceCase.class} );
  2. 将监听器添加到组件:

    button.addActionListener( new MethodExpressionActionListener(targetExpression));
  3. 与当前问题不完全相关,您还省略了组件的id属性。为了安全起见,添加

    button.setId("theButton");

    编辑:在动态创建命令组件时,您绝对必须设置 id 属性

关于JSF/PrimeFaces : programmatic <f:setPropertyActionListener> on <p:commandButton> not firing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17343336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com