【问题标题】:Does ExpressionLanguage (EL) allow to call a method with a NULL argument?ExpressionLanguage (EL) 是否允许使用 NULL 参数调用方法?
【发布时间】:2011-12-03 08:34:59
【问题描述】:

我使用 Tomcat7 和 JSF2。我使用方法调用,如

 action="#{bean.method(22)}"

 action="#{bean.method(var)}"

var 是一个 EL 变量。

但是,如果varnull,或者我尝试调用#{bean.method(null),我会得到一个NPE,并且不会调用该方法。

有没有办法将null 参数传递给EL 中的方法? EL 中有 null 的文字吗?

谢谢

【问题讨论】:

    标签: java tomcat jsf-2 null el


    【解决方案1】:

    我在 Apache 7.0.47 上遇到了同样的问题。它在更新到7.0.56 后消失了。

    所以这可能是一个错误,虽然我找不到任何问题跟踪器条目。

    【讨论】:

      【解决方案2】:

      如果可能(您可以访问 bean 方法),您可以将方法从 int 更改为 Integer,然后在设置之前检查 null。

      method(int myInteger){
          if(myInt == null){
              return;
          }
      
          this.beanInt = myInteger;
      }
      

      【讨论】:

      • 这不会有帮助,因为在调用 bean 方法之前抛出了异常。 (更改为 Object 也无济于事。)
      【解决方案3】:

      我可以在 Tomcat 7.0.22 上重现此问题,但不能在 Glassfish 3.1.1 上重现。 NPE 堆栈跟踪提示 Apache EL 实现在这里是错误的:

      Caused by: java.lang.NullPointerException
          at java.lang.Class.isAssignableFrom(Native Method)
          at org.apache.el.util.ReflectionUtil.isAssignableFrom(ReflectionUtil.java:299)
          at org.apache.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:172)
          at org.apache.el.parser.AstValue.invoke(AstValue.java:251)
          at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
          at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
          at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
      

      它不应该使用 null 参数调用 Class#isAssinableFrom()。它的javadoc 也禁止这样做。我会将其作为错误报告给 apache.org 那边的 Tomcat 人员。根据EL 2.2 spec 所说的内容,它应该被允许(因此应该跳过Class#isAssignableFrom() 调用),或者作为ELException 或其子类之一抛出。

      【讨论】:

      • 如果您在此处发布问题 URL,那就太好了。
      • @jFrenetic:我还没有发布。这只是对 OP 的建议。如果 OP 不发布它,我可能会在我再次阅读 EL 规范后发布它,即使这显然是 IMO 的一个错误。在收到几次 Tomcat 错误报告后,我发现 Tomcat 开发人员对规范的要求非常严格。
      猜你喜欢
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 2017-03-13
      • 1970-01-01
      • 2019-12-05
      • 2012-08-20
      相关资源
      最近更新 更多