【问题标题】:EL Expression parsing integer as longEL 表达式解析整数 as long
【发布时间】:2012-07-03 05:40:51
【问题描述】:

我在 JBoss 7 上使用带有 primefaces 的 JSF 2.0。在代码的某些部分,我有以下内容:

public void setItemValue(int value) {
    this.value = value;
}

在 xhtml 中:

<p:commandButton ajax="true" value="Button" update="@form" 
action="#{bean.setItemValue(1)}"/>

问题是,当我点击按钮时,我得到一个javax.el.MethodNotFoundException,说setItemValue(java.lang.Long) 不存在。当然不是,它应该是一个 int 或 Integer 值!有人见过这个问题吗?除了改变我的接收方法之外还有其他选择吗?谢谢!

编辑:刚刚下载了 JBoss 7.2 的 SNAPSHOT,运行良好。看起来它是 JBoss 7.1.1 的错误 :(

【问题讨论】:

  • 尝试使用 f:setPropertyActionListener 或 #{bean.setItemValue('1')}
  • 第二次尝试:Method not found: bean.setItemValue(java.lang.String)。但是第一次尝试成功了!不好的部分是我仍然无法通过 jsf 将 Integerint 传递给方法,但这是一个很好的解决方法:)
  • 与 Tomcat 7.0.26 相同。切换到 Tomcat 7.0.28 为我修复了它。我确实认为 EL 中的文字确实很长,但我喜欢 Integer 方法在 Tomcat 7.0.28 中与匹配的事实。

标签: java jsf-2 jboss el


【解决方案1】:

看起来有点奇怪,但是你可以在 EL 2.2 内部的 Long 对象 self 上调用 intValue 方法

<p:commandButton ... action="#{bean.setItemValue((1).intValue())}"/>

【讨论】:

  • 在 java.lang.Long 类型上找不到属性“intValue”
  • 您是否在 intValue 中添加了括号? #{bean.myLongValue.intValue()}?
【解决方案2】:

action的方法表达式类型是

字符串动作()

所以用

 public String setItemValue(Integer value) {
    this.value = value;
    return null;
}

另见:

更新 您需要将 Servlet 版本声明为 3.0 以充分利用 EL 2.2,例如传递参数。为此,将 web.xml 中的 web-app 元素更改为:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID"  
 version="3.0">

【讨论】:

  • 如果返回null,则重新加载当前页面。如果你有,那么只需返回一个结果视图。
  • 感谢关于动作方法签名的解释!不幸的是,错误仍然存​​在:(Method not found: bean.setItemValue(java.lang.Long)
  • 嗨 Ravi,抱歉拖了太久。我已经使用 Servlet 3.0,我可以传递参数 OK,但它是 Long,而不是我期望的 Integer。我下载了JBoss 7.2 SNAPSHOT,运行良好……可能是JBoss 7.1.1的bug
【解决方案3】:

不要在任何 bean 方法中使用 getset 前缀(这是一个非常糟糕的做法),action 属性需要一个方法名称,而不是一些 getter 或 setter

getset 仅用于 bean 变量的 getter 和 setter

最好用类似assignItemValue 的东西替换你的setItemValue

像这样:

<p:commandButton ajax="true" value="Button" update="@form" 
    action="#{bean.assignItemValue(1)}"/>

在哪里

public void assignItemValue(Long value) { //you could also try with int value...
   //set the value to whenever you want too...
}

【讨论】:

  • 同样的错误:Method not found: bean.assignItemValue(java.lang.Long)
  • 为什么不把方法参数改成 Long 呢?
  • 为什么我必须强制使用 Long,因为 Java 的默认值是 Integer?
【解决方案4】:

为复活这条古老的线索而道歉。 如果您仍在使用 Jboss 7.11 或遇到类似问题并且不想走 EL (1).intValue() 路线,您也可以在托管 bean 中按自己的方式解决它,如下所示:-

public String setItemValue(Long longVal) {
    return setItemValue(longVal.intValue());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2011-09-14
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多