javax.el.PropertyNotFoundException: использование JSTL в JSP - PullRequest
10 голосов
/ 07 ноября 2010

У меня есть 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: свойство 'rssFeedURLs' не найдено для типа RSSFeedOccurrenceMiner

Что является правильным, учитывая мойиспользование наследства.Так может кто-нибудь сказать мне, разрешает ли JSTL наследование или в моем коде чего-то не хватает?

Я действительно не хочу использовать скриптлет в JSP.

Ответы [ 3 ]

23 голосов
/ 07 ноября 2010

Ваш метод получения не соответствует соглашению об именах JavaBeans. Оно должно быть названо getRssFeedURLs (даже если у вас есть аббревиатура, оно должно быть написано с заглавной буквы, как обычное слово). В EL, когда вы указываете имя свойства, оно фактически вызывает метод получения этого свойства. Чтобы выяснить имя получателя, он вводит первую букву в имени свойства, которое вы указали (поэтому rssFeedURLs преобразуется в RssFeedURLs), и ставит get перед ним. Таким образом, вы в конечном итоге с getRssFeedURLs. Тем не менее, вы назвали свой метод как getRSSFeedURLs. Java не может найти метод, и вы получите исключение PropertyNotFoundException.

Если вы не укажете имя получателя правильно, вы не сможете получить к нему доступ с помощью EL.

10 голосов
/ 07 ноября 2010

Если имя свойства начинается с двух или более заглавных букв, то к нему следует обращаться также, как и в EL. Итак, для доступа к геттеру getRSSFeedURLs() вам нужно ${rssfom.RSSFeedURLs}.

Это также указано в JavaBeans Spec .

8.8 Использование заглавных букв в названии.

Когда мы используем шаблоны проектирования для вывода имени свойства или события, нам необходимо решить, какие правила следовать за заглавной буквы предполагаемого имени. Если мы извлекаем имя из середины нормального Имя Java в смешанном стиле, тогда имя по умолчанию будет начинаться с заглавной буквы. Java-программисты привыкли, что нормальные идентификаторы начинаются со строчных букв. Активный вклад рецензента убедил нас, что мы должны следовать этому же обычному правилу для имен свойств и событий.

Таким образом, когда мы извлекаем имя свойства или события из середины существующего имени Java, мы обычно преобразуйте первый символ в нижний регистр. Однако, чтобы поддержать случайное использование всех имена в верхнем регистре, мы проверяем, являются ли первые два символа имени заглавными, и если так что оставь это в покое . Так, например,

«FooBah» становится «FooBah»
«Z» становится «z»
«URL» становится «URL»

Мы предоставляем метод Introspector.decapitalize, который реализует это правило преобразования.

JSP EL (язык выражений, все эти ${} вещи) соответствует спецификации JavaBeans. Таким образом, это не имеет никакого отношения к JSTL (теги <c:xxx>).

0 голосов
/ 09 июня 2016

Мой 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: свойство 'Id' не найдено втип DocumentPolicyVO

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

Пожалуйста, кто-нибудь может объяснить причину.

...