Позволяет ли ExpressionLanguage (EL) вызывать метод с аргументом NULL? - PullRequest
1 голос
/ 08 октября 2011

Я использую Tomcat7 с JSF2.Я использую вызовы методов, такие как

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

или

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

, где var - это переменная EL.

Однако, если var равно null,или я пытаюсь вызвать #{bean.method(null) я получаю NPE, а метод не вызывается.

Есть ли способ передать аргумент null методу в EL?Есть ли буквальное выражение для null в EL?

Спасибо

Ответы [ 3 ]

3 голосов
/ 08 октября 2011

Я могу воспроизвести эту проблему на 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)

Он не должен был вызывать Class#isAssinableFrom() с аргументом null. Его Javadoc также запрещает это. Я бы сообщил об этом как об ошибке парням из Tomcat там, на apache.org. В зависимости от того, что говорится в спецификации EL 2.2 , его следует либо разрешить (и, следовательно, вызов Class#isAssignableFrom() должен был быть пропущен), либо выброшен как ELException или один его подклассов.

0 голосов
/ 07 мая 2015

У меня была такая же проблема на Apache 7.0.47.Он исчез после обновления до 7.0.56.

Так что, вероятно, это была ошибка, хотя я не смог найти ни одной записи трекера.

0 голосов
/ 08 октября 2011

Если возможно (у вас есть доступ к методу bean), вы можете изменить свой метод с int на Integer, а затем выполнить проверку на нулевое значение, прежде чем устанавливать его.

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

    this.beanInt = myInteger;
}
...