javax.El.PropertyNotFoundException: utiliser JSTL dans JSP

j'ai un JSP où j'essaie d'utiliser des tags JSTL pour afficher des données à partir d'une instance en mémoire d'une classe. Les données se composent d'une série de chaînes où chaque chaîne est l'adresse D'un flux RSS.

dans le JSP, j'ai le code suivant:

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

fondamentalement, rssfom est une instance de la classe suivante:

public class RSSFeedOccurrenceMiner extends RSSFeedMiner {

   private HashMap<String, Counter> keywordFrequencies;

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

ceci hérite de la classe RSSFeedMiner qui contient la variable et les méthodes suivantes:

private ArrayList<String> rssFeedURLs;

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

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

Donc dans l' JSP, je pensais pouvoir utiliser le code ci-dessus mais quand la page est lancée, je reçois simplement une table vide. Et dans les logs du serveur, j'ai tendance à trouver le message:

javax.El.PropertyNotFoundException: Property 'rssFeedURLs' not found on type RSSFeedOccurrenceMiner

ce qui est correct compte tenu de mon usage de l'héritage. Quelqu'un peut-il me dire si JSTL autorise l'héritage ou s'il manque quelque chose dans mon code?

je ne veux vraiment pas utiliser un scriptlet dans le JSP.

10
demandé sur BalusC 2010-11-07 19:36:17

3 réponses

votre méthode getter ne suit pas la convention de nommage JavaBeans. Il devrait être nommé getRssFeedURLs (même si vous avez un acronyme, il doit être en majuscule comme un mot). Dans EL, quand vous spécifiez un nom de propriété, il finit en fait par appeler le getter pour cette propriété. Pour comprendre le nom du getter, il majuscule la première lettre dans le nom de la propriété que vous avez fourni (donc rssFeedURLs conversion RssFeedURLs) et de punaises sur get à l'avant. Si vous vous retrouvez avec getRssFeedURLs. Cependant, vous avez nommé votre méthode getRSSFeedURLs. Java ne peut pas trouver la méthode et donc vous obtenez un PropertyNotFoundException exception.

si vous ne nommez pas correctement vos getters, vous ne pouvez pas y accéder avec EL.

23
répondu Vivin Paliath 2010-11-07 16:52:39

si le nom de la propriété commence par deux ou plusieurs capitales suivantes, alors il devrait être accédé comme cela dans EL aussi bien. Donc, pour accéder à la lecture getRSSFeedURLs() vous avez besoin d' ${rssfom.RSSFeedURLs}.

C'est spécifié dans JavaBeans Spec.

8.8 capitalisation des noms inférés.

lorsque nous utilisons des modèles de conception pour déduire un nom de propriété ou d'événement, nous devons décider quelles règles à suivre pour capitaliser le nom inféré. Si nous extrait le nom du milieu de la normale nom Java de style mixedCase alors le nom commencera par une lettre majuscule par défaut. Les programmeurs Java sont habitués à ce que les identificateurs normaux commencent par des lettres minuscules. Vigoureux réviseur d'entrée nous a convaincu que nous devrions suivre cette même règle conventionnelle pour les noms de propriétés et d'événements.

Ainsi, lorsque nous extrayons un nom de propriété ou d'Événement du milieu D'un nom Java existant, nous normalement convertir le premier caractère à minuscule. Cependant pour soutenir l'utilisation occasionnelle de tous les noms en majuscules, nous vérifions si les deux premiers caractères du nom sont en majuscules et si donc le laisser seul. Ainsi, par exemple,

"FooBah" devient "fooBah"

"Z" devient "z"

"URL" devient "URL"

nous fournissons un Introspecteur de méthode.decapitalize qui implémente cette règle de conversion.

le JSP EL (Langage d'Expression, ceux ${} choses) adhère à la spécification JavaBeans. Ceci n'est donc pas spécifiquement lié à JSTL (ceux <c:xxx> tags).

10
répondu BalusC 2010-11-07 17:25:52

mon VO a un code suivant

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

quand j'essaie d'y accéder dans une page jsp comme ci-dessous, il donne l'erreur suivante javax.El.PropertyNotFoundException: la Propriété 'Id' non trouvé sur le type de DocumentPolicyVO

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

s'il vous Plaît tout le monde peut en expliquer la raison.

-1
répondu Ankur Mehrotra 2016-06-09 12:00:21