Jsf 在EL中向支持bean方法传递字符(vs传递字符串)

Jsf 在EL中向支持bean方法传递字符(vs传递字符串),jsf,primefaces,el,Jsf,Primefaces,El,我想直接从命令按钮调用setter并传递一个值。我的问题是,如果将其作为字符串传回,setter需要一个字符和jsf。有没有一个好方法可以在前端“修复”这个问题,而不必在我的backingbean上重载setter 命令按钮: <p:commandButton value="SignOff" actionListener="#{manageItemHandler.dataEntryOp.setBomComplete('Y')}" rendered="#{speed2Sess

我想直接从命令按钮调用setter并传递一个值。我的问题是,如果将其作为字符串传回,setter需要一个字符和jsf。有没有一个好方法可以在前端“修复”这个问题,而不必在我的backingbean上重载setter

命令按钮:

<p:commandButton value="SignOff"
    actionListener="#{manageItemHandler.dataEntryOp.setBomComplete('Y')}"
    rendered="#{speed2Session.isRendered('editManageItemOp')}"/>
当我点击命令按钮时,我得到

11:47:19,270 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-steves-172.16.8.26-15081-1) JSF1073: javax.faces.event.AbortProcessingException caught during processing of INVOKE_APPLICATION 5 : UIComponent-ClientId=centerForm:j_idt271, Message=Method not found: data.operation.OperationData@595025a.setBomComplete(java.lang.String)
11:47:19,273 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-steves-172.16.8.26-15081-1) Method not found: data.operation.OperationData@595025a.setBomComplete(java.lang.String): javax.faces.event.AbortProcessingException: Method not found: data.operation.OperationData@595025a.setBomComplete(java.lang.String)

不幸的是,这是故意的。引号中的所有内容在EL中都被视为
字符串
。一种解决方法是传递
String#charAt()

#{manageItemHandler.dataEntryOp.setBomComplete('Y'.charAt(0))}
这只是丑陋。另一种方法是传递其
int
码点,即
Y的
89

#{manageItemHandler.dataEntryOp.setbomplete(89)}
但这并不完全是自我记录。更好的方法是只使用枚举

public enum Choice {
    Y, N;
}

您可以通过所需的方式调用它

#{manageItemHandler.dataEntryOp.setbomplete('Y')}

字符串
'Y'
将自动转换为该枚举。另外,枚举还有许多其他优点,例如编译时类型安全。

这是设计上的不幸。引号中的所有内容在EL中都被视为
字符串
。一种解决方法是传递
String#charAt()

#{manageItemHandler.dataEntryOp.setBomComplete('Y'.charAt(0))}
这只是丑陋。另一种方法是传递其
int
码点,即
Y的
89

#{manageItemHandler.dataEntryOp.setbomplete(89)}
但这并不完全是自我记录。更好的方法是只使用枚举

public enum Choice {
    Y, N;
}

您可以通过所需的方式调用它

#{manageItemHandler.dataEntryOp.setbomplete('Y')}

字符串
'Y'
将自动转换为该枚举。作为奖励,枚举还有更多的优点,例如编译时类型安全。

我尝试直接使用简单引号,而不使用charAt(0)提示

当参数类型为
char
Character
时,此功能正常工作

传递字符的示例:

#{manageItemHandler.dataEntryOp.setBomComplete('Y')}
传递字符串文字和字符常量的示例:

<p:panel style="border:none;#{vC.traceUpdate('p:panel','X')}">

其中,
Character
替换为
char


此示例使用Primefaces 6.2.4在Glassfish 4.1上运行。

我尝试直接使用简单引号,而不使用charAt(0)提示

当参数类型为
char
Character
时,此功能正常工作

传递字符的示例:

#{manageItemHandler.dataEntryOp.setBomComplete('Y')}
传递字符串文字和字符常量的示例:

<p:panel style="border:none;#{vC.traceUpdate('p:panel','X')}">

其中,
Character
替换为
char


此示例使用Primefaces 6.2.4在Glassfish 4.1上运行。

感谢您(一如既往)对该行为的透彻解释并给出多种可能的解决方案。感谢您(一如既往)对该行为的透彻解释并给出多种可能的解决方案。请注意,
{…}
事物不是JSF的一部分。他们是EL的一部分。所以提到JSF版本是无关紧要的。更有趣的是EL版本和EL实现。浏览器是完全不相关的,因为Java/JSF/EL/etc在服务器上而不是在客户端上运行this@BalusC:如何找到我使用的EL版本?它通常与服务器品牌/版本紧密耦合(例如“WildFly 14.0.0.Final”,我们可以在它的modules子文件夹中找到,默认情况下,它附带一个Oracle EL 3.0.1 JAR文件),除非您已经从webapp端覆盖了EL实现(您很可能没有,否则您会知道)。GlassFish 4.1默认情况下也附带Oracle EL 3.0.1。PrimeFaces对EL没有影响。请注意,
{…}
事物不是JSF的一部分。他们是EL的一部分。所以提到JSF版本是无关紧要的。更有趣的是EL版本和EL实现。浏览器是完全不相关的,因为Java/JSF/EL/etc在服务器上而不是在客户端上运行this@BalusC:如何找到我使用的EL版本?它通常与服务器品牌/版本紧密耦合(例如“WildFly 14.0.0.Final”,我们可以在它的modules子文件夹中找到,默认情况下,它附带一个Oracle EL 3.0.1 JAR文件),除非您已经从webapp端覆盖了EL实现(您很可能没有,否则您会知道)。GlassFish 4.1默认情况下也附带Oracle EL 3.0.1。PrimeFaces对EL没有影响。
@ManagedBean(name = "vC")
@ViewScoped
public class ActionViewController
extends AbstractViewController
    {
    public String traceUpdate(String s, char c)
        {
        System.out.println("s:" + s + " " + c);
        return "";
        }