传递一个字符(相对于通过字符串)到背衬bean方法在EL(Passing a Character (

2019-07-01 19:09发布

我想直接从一个命令按钮调用一个setter和传递值。 我的问题是,二传手期待一个字符和JSF,如果它传递回为一个字符串。 有没有“修复”这在前端,而不必过载上我支持bean的setter的好办法?

的commandButton:

<p:commandButton value="SignOff"
    actionListener="#{manageItemHandler.dataEntryOp.setBomComplete('Y')}"
    rendered="#{speed2Session.isRendered('editManageItemOp')}"/>

从背衬豆的getter / setter:

protected Character bomComplete;

/**
 * @return the bomComplete
 */
public Character getBomComplete() {
    return bomComplete;
}
/**
 * @param bomComplete the bomComplete to set
 */
public void setBomComplete(Character bomComplete) {
    this.bomComplete = bomComplete;
}

当我单击命令我得到

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)

Answer 1:

这是不幸的设计。 在引号一切都在EL视为String 。 一种解决方法是通过String#charAt()来代替。

#{manageItemHandler.dataEntryOp.setBomComplete('Y'.charAt(0))}

这仅仅是难看。 另一种方法是通过其int码点代替,这是89Y

#{manageItemHandler.dataEntryOp.setBomComplete(89)}

但是,这是不完全的自我记录。 更好的是只使用枚举。

public enum Choice {
    Y, N;
}

protected Choice bomComplete;

你可以只调用所需的方法

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

字符串'Y'将被自动转换为枚举。 作为奖励,枚举有更多额外的好处,如编译时类型安全。



Answer 2:

我曾尝试使用简单的报价上,无需使用的charAt(0)提示...

这正常工作时的参数类型为charCharacter

实施例通过一个字符:

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

实施例通过一个字符串文字和字符常数:

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

traceUpdate()Java方法是以下的代码:

@ManagedBean(name = "vC")
@ViewScoped
public class ActionViewController
extends AbstractViewController
    {
    public String traceUpdate(String s, Character c)
        {
        System.out.println("s:" + s + " " + c);
        return "";
        }

要么

@ManagedBean(name = "vC")
@ViewScoped
public class ActionViewController
extends AbstractViewController
    {
    public String traceUpdate(String s, char c)
        {
        System.out.println("s:" + s + " " + c);
        return "";
        }

其中, Character作为被替换char

这个例子使用Primefaces 6.2.4在Glassfish 4.1上运行。



文章来源: Passing a Character (vs passing String) to backing bean method in EL