javax.el.PropertyNotFoundException:在JSP中使用JSTL

时间:2010-11-07 16:36:17

标签: jsp jstl el propertynotfoundexception

我有一个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。

3 个答案:

答案 0 :(得分:23)

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

如果您没有正确命名您的getter,则无法使用EL访问它们。

答案 1 :(得分:10)

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

这也在JavaBeans Spec中指定。

  

8.8推断名称的大写。

     

当我们使用设计模式推断属性或事件名称时,我们需要确定哪些规则   跟随大写推断名称。如果我们从正常的中间提取名称   mixedCase样式的Java名称,默认情况下,名称将以大写字母开头。   Java程序员习惯于使用小写字母开头。   强有力的评论者输入使我们确信我们应该遵循同样的传统规则   对于财产和事件名称。

     

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

     

“FooBah”成为“fooBah”
  “Z”变为“z”
  “URL”变为“URL”

     

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

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

答案 2 :(得分:-1)

我的VO有以下代码

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:viewportHeight="81.875"
android:viewportWidth="65.59"
android:width="24dp"
>
   <group name=""dot_name
          pivotX="viewportHeight / 2"
          pivotY="viewportWidth / 2">  <!--Calculate the values by yourself, write the calucalted values in there. This moves the reference point to the middle --> 
   <path
        android:fillColor="#FF000000"
        android:pathData="M-0.01,32.82a32.81,32.81 0,1 1,65.61 0c0,28.94 -32.8,49.04 -32.8,49.04S-0.01,61.77 -0.01,32.82Z"
    />
    </group>
</vector>

当我尝试在jsp页面中访问它时,如下所示,它给出以下错误javax.el.PropertyNotFoundException:Property&#39; Id&#39;找不到类型DocumentPolicyVO

 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;
            }
    }

请有人解释原因。