2

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

命令按钮:

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

来自支持 bean 的 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)
4

2 回答 2

3

不幸的是,这是设计使然。引号中的所有内容在 EL 中都被视为String. 一种解决方法是通过String#charAt()

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

这只是丑陋的。另一种方法是传递其int代码点,即89for Y

#{manageItemHandler.dataEntryOp.setBomComplete(89)}

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

public enum Choice {
    Y, N;
}

protected Choice bomComplete;

您可以调用所需的方式

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

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

于 2012-10-22T16:23:37.933 回答
1

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

当参数类型为char或时,这可以正常工作Character

传递字符的示例:

#{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 上运行。

于 2018-08-31T11:13:16.897 回答