【问题标题】:javax.el.PropertyNotFoundException: using JSTL in JSP [duplicate]javax.el.PropertyNotFoundException:在 JSP 中使用 JSTL [重复]
【发布时间】:2011-05-06 08:08:39
【问题描述】:

我有一个 JSP,我试图在其中使用 JSTL 标记来显示来自类的内存中实例的数据。数据由一系列字符串组成,其中每个字符串都是 RSS 提要的地址。

在 JSP 中,我有以下代码:

<table border = "1">
    <tr>
        <c:forEach var = "rssFeedURL" items = "${rssfom.rssFeedURLs}">
            <td align = "left">${rssFeedURL}</td>
        </c:forEach>
    </tr>
</table>

基本上,rssfom 是以下类的一个实例:

public class RSSFeedOccurrenceMiner extends RSSFeedMiner {

   private HashMap<String, Counter> keywordFrequencies;

   public RSS_Feed_OccurrenceMiner() {
      super();
      this.keywordFrequencies = new HashMap();
   }
   ...
}

这继承自 RSSFeedMiner 类,其中包含以下变量和方法:

private ArrayList<String> rssFeedURLs;

public ArrayList<String> getRSSFeedURLs() {
    return rssFeedURLs;
}

public void setRSSFeedURLs(ArrayList<String> rssFeedURLs) {
    this.rssFeedURLs = rssFeedURLs;
}

所以在 JSP 中,我认为我可以使用上面的代码,但是当页面运行时,我只是收到一个空表。在服务器日志中,我倾向于找到消息:

javax.el.PropertyNotFoundException:在类型 RSSFeedOccurrenceMiner 上找不到属性“rssFeedURLs”

鉴于我使用继承,这是正确的。那么谁能告诉我 JSTL 是否允许继承,或者我的代码中是否缺少某些东西?

我真的不想在 JSP 中使用 scriptlet。

【问题讨论】:

    标签: jsp jstl el propertynotfoundexception


    【解决方案1】:

    我的 VO 有以下代码

     public class DocumentPolicyVO {
              @JsonProperty("Id")
                private String Id;
                @JsonProperty("Id")
                public String getId() {
                    return Id;
                }
         @JsonProperty("Id")
                public void setId(String Id) {
                    this.Id = Id;
                }
        }
    

    当我尝试在下面的 jsp 页面中访问它时,它会给出以下错误 javax.el.PropertyNotFoundException: Property 'Id' not found on type DocumentPolicyVO

    <select name="settingsListExcludingEnvironmentList" class="selectComboboxCheck">
                                                      <c:forEach var="settingsType" items="${settingsListExcludingEnvironmentList}">
                                                          <option value="${settingsType.Id}">${settingsType.Name}</option>
                                                      </c:forEach>
                                            </select>
    

    请任何人解释原因。

    【讨论】:

    • 如果您还有其他问题,请点击 按钮进行提问。
    【解决方案2】:

    如果属性名称以两个或多个后续大写字母开头,那么它也应该像在 EL 中那样访问。因此,要访问 getter getRSSFeedURLs(),您需要 ${rssfom.RSSFeedURLs}。

    这也在JavaBeans Spec 中指定。

    8.8 推断名称的大写。

    当我们使用设计模式来推断属性或事件名称时,我们需要确定哪些规则 跟随以大写推断的名称。如果我们从一个普通的中间提取名字 混合大小写风格的 Java 名称,那么名称将默认以大写字母开头。 Java 程序员习惯于让普通标识符以小写字母开头。 积极的审稿人意见使我们相信我们应该遵循同样的传统规则 用于属性和事件名称。

    因此,当我们从现有 Java 名称的中间提取属性或事件名称时,我们 通常将第一个字符转换为小写。 不过支持偶尔使用所有 大写名称,我们检查名称的前两个字符是否都是大写的,如果 所以别管它。比如,

    “FooBah”变成“fooBah”
    “Z”变成“z”
    “网址”变成了“网址”

    我们提供了一个方法 Introspector.decapitalize 来实现这个转换规则。

    JSP EL(表达式语言,${} 的东西)遵循 JavaBeans 规范。因此,这与 JSTL(那些 &lt;c:xxx&gt; 标记)没有特别的关系。

    【讨论】:

    • java xZone 中的属性有 getter getXZone()... 但是在 jsp el 表达式中的访问是 foo.XZone 这就是为什么它更好地避免在第一个位置仅使用一个字母不大写的属性。
    • @Jesus:EL 不查看字段名称,而是从 getter 推断名称。 EL 完全忽略了该字段。另见 a.o. stackoverflow.com/q/8577545
    • 是的,我试图指出的是,el 从 getter 推断名称,因此推断“XZone”作为属性名称,然后您在 java 中拥有名为 xZone 的属性,但实际上 jsp 中的 XZone 是相同的属性,因此可能会导致错误
    【解决方案3】:

    您的 getter 方法不遵循 JavaBeans 命名约定。它应该被命名为getRssFeedURLs(即使你有一个首字母缩写词,它也应该像普通单词一样大写)。在 EL 中,当您指定属性名称时,它实际上最终会调用该属性的 getter。要找出 getter 的名称,它将您提供的属性名称中的第一个字母大写(因此 rssFeedURLs 被转换为 RssFeedURLs),并将 get 添加到它的前面。所以你最终得到getRssFeedURLs。但是,您已将方法命名为 getRSSFeedURLs。 Java 找不到该方法,因此您会收到 PropertyNotFoundException 异常。

    如果你没有正确命名你的 getter,你就不能用 EL 访问它们。

    【讨论】:

    • 没错,我稍微重命名了该方法,但在这种情况下不认为这是错误。
    • @Mr Morgan,您是否将方法重命名为getRssFeedURLs 并尝试一下?
    • @Vivin Palaith:我欠你的。将方法重命名为 Java 约定非常有效。我以前遇到过 JSTL 的问题,但从来没有这样。非常感谢。
    • 再次感谢。这需要我几个小时才能解决。
    • 哦,太好了。另一个驱动式投票。
    猜你喜欢
    • 2012-08-29
    • 2014-06-30
    • 2016-11-23
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多