【问题标题】:EL out of attribute in IntelliJIntelliJ中的EL属性不足
【发布时间】:2026-02-19 14:55:01
【问题描述】:

在 intelliJ 中,我收到以下代码的错误消息“EL out of attribute”:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">

<h:body>
    <h1>JSF and Spring</h1>
    #{helloBean.hello()}
</h:body>
</html>

显然这是 EL 扩展的非标准用法,但我很难理解我应该如何做到这一点。我的代码工作得很好,但我喜欢使用“正确”的方式,IntelliJ 中的警告可能意味着我缺少一些东西。

我应该如何将其写成“正确”的 JSF 2?

【问题讨论】:

    标签: jsf intellij-idea el


    【解决方案1】:

    我在这里可能错了,但是out of attribute 建议您不要在模板中的任何随机位置使用 EL,而只能在标签的属性中使用。

    这是豆子:

    @ViewScoped
    @ManagedBean
    public class TestBean {
        private String message = "Hello world";
    
        public TestBean() {
            System.out.println("TestBean instantiated.");
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public String fetchMsg() {
            return "Msg fetched: " + message;
        }
    }
    

    这里是 XHTML:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>JSF Tutorial!</title>
    </h:head>
    <h:body>
        <!--No warning message-->
        <h:outputText value="#{testBean.message}"/>
        <h:outputText value="#{testBean.fetchMsg()}"/>
    
        <!--Warning message-->
        #{testBean.fetchMsg()}
    </h:body>
    </html>
    

    使用想法 14。

    【讨论】:

      【解决方案2】:

      我有同样的问题。我用 $ 替换了 # 并且 IntelliJ 不再抱怨。 $ 可以在只读属性的情况下使用 - 我猜 IntelliJ 强制执行更严格的语法。

      【讨论】:

      • 不。 IntelliJ 并不像它假装的那么聪明。顺便说一句,没有一个 IDE。基本上,每个针对 Java 的 IDE 在如何验证 EL 方面都有相当多的失败。只需阅读 jcp.org 上的 EL 规范,了解如何编写有效的 EL,然后在 IDE 中禁用 EL 验证以避免烦恼。
      【解决方案3】:

      严格回答您的问题,要“正确”,您将编写如下内容:

      一颗豆子:

      @ViewScoped
      public class HelloBean {
          public String getHello() {
              return "Whoa!";
          }
      }
      

      在你看来:

      ...
      <h:body>
          #{helloBean.hello}
      </h:body>
      ...
      

      虽然您可以像以前一样在 EL 2.1+ 中调用方法,但以前版本的 EL 不允许这样做。

      在此示例中,您可能会注意到,对于 bean 中名为 getHello 的方法,可以在没有 get 的情况下使用它,就像在 #{helloBean.hello} 中一样,因为 EL 会找到该方法并隐式调用 get

      关于 IDE 对看似正确的代码显示警告,您可以检查配置的项目库版本是否与您实际想要处理的版本匹配。

      例如,您想使用 JSF 2.x,但项目设置为使用 1.x。这可能会发生。

      希望对你有帮助。

      【讨论】:

      • 所以我原来写的都是按标准的?但 IntelliJ 错误地说它不是?我试过你说的,但 IntelliJ 也不喜欢这种方法。 (见更新的截图)
      • 你有一个带有 getHello() 方法的 HelloBean 吗?我会更新我的答案以使其更清楚
      • 是的,我有,而且代码也可以工作,但我想知道我是否以一种凌乱的方式这样做,因为 IntelliJ 抱怨它没有属性。
      • 抱歉,我注意到您使用的是 Spring。我从未使用过 Spring,但我将 IntelliJ 用于 JSF 并且从未遇到过这个问题。也许这与您的项目设置有关。