2010-11-07 20 views
9

Tengo un JSP donde intento usar etiquetas JSTL para mostrar datos de una instancia en memoria de una clase. Los datos consisten en una serie de cadenas donde cada cadena es la dirección de una fuente RSS.javax.el.PropertyNotFoundException: utilizando JSTL en JSP

En el JSP, tengo el siguiente código:

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

Básicamente, rssfom es una instancia de la clase siguiente:

public class RSSFeedOccurrenceMiner extends RSSFeedMiner { 

    private HashMap<String, Counter> keywordFrequencies; 

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

Este hereda de RSSFeedMiner clase que contiene la variable siguiente y métodos:

private ArrayList<String> rssFeedURLs; 

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

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

Así que en el JSP, pensé que nos sería posible e el código anterior, pero cuando se ejecuta la página, simplemente recibo una tabla vacía. Y en los registros del servidor, tiendo a encontrar el mensaje:

javax.el.PropertyNotFoundException: Propiedad '' rssFeedURLs que no se encuentran en el tipo RSSFeedOccurrenceMiner

Qué es correcta dado mi uso de la herencia. Entonces, ¿alguien puede decirme si JSTL permite la herencia o hay algo que falta en mi código?

Realmente no quiero usar un scriptlet en el JSP.

Respuesta

22

Su método getter no sigue la convención de nomenclatura JavaBeans. Debe llamarse getRssFeedURLs (incluso si tiene un acrónimo, debe escribirse en mayúscula como una palabra normal). En EL, cuando especifica un nombre de propiedad, en realidad termina llamando al getter para esa propiedad. Para averiguar el nombre del captador, escribe en mayúscula la primera letra del nombre de la propiedad que ha proporcionado (para que rssFeedURLs se convierta en RssFeedURLs) y en get al frente del mismo. Entonces terminas con getRssFeedURLs. Sin embargo, ha nombrado su método como getRSSFeedURLs. Java no puede encontrar el método y, por lo tanto, obtiene una excepción PropertyNotFoundException.

Si no nombra a sus usuarios bien, no puede acceder a ellos con EL.

+0

Cierto, cambié el nombre del método ligeramente, pero no veo esto como el error en este caso. –

+0

@Mr Morgan, ¿cambió el nombre del método a 'getRssFeedURLs' y lo intentó? –

+0

@Vivin Palaith: Estoy en deuda con usted. Cambiar el nombre del método a la convención de Java funcionó perfectamente. He tenido problemas con JSTL antes, pero nunca me gusta esto. Muchas gracias. –

10

Si el nombre de la propiedad comienza con dos o más mayúsculas subsiguientes, debe accederse así en EL también. Por lo tanto, para acceder al getter getRSSFeedURLs() necesita ${rssfom.RSSFeedURLs}.

Eso se especifica en JavaBeans Spec también.

8.8 Mayúsculas en los nombres inferidos.

Cuando utilizamos patrones de diseño para inferir un nombre de propiedad o evento, tenemos que decidir qué reglas se seguirán en para capitalizar el nombre inferido. Si extraemos el nombre del medio de un nombre de Java de estilo de caja mixta normal, el nombre comenzará de manera predeterminada con una letra mayúscula. Los programadores de Java están acostumbrados a que los identificadores normales comiencen con letras minúsculas. La entrada enérgica del revisor nos ha convencido de que debemos seguir esta misma regla convencional para los nombres de propiedad y evento.

Así, cuando se extrae una propiedad o nombre del evento desde la mitad de un nombre existente de Java, que normalmente convertir el primer carácter a minúsculas. Sin embargo, para admitir el uso ocasional de todos los nombres de mayúsculas , verificamos si los dos primeros caracteres del nombre son mayúsculas y si es , entonces déjalo en blanco. Así, por ejemplo,

“FooBah” se convierte en “fooBah”
“Z” se convierte en “z”
“URL” se convierte en “URL”

Proporcionamos un método Introspector.decapitalize que implementa esta regla de conversión.

El JSP EL (lenguaje de expresión, esas cosas ${}) adhiere a la especificación de JavaBeans. Esto no está específicamente relacionado con JSTL (esas etiquetas).

+0

La propiedad en Java xZone tiene getter getXZone() ... pero el acceso en jsp el expresión es foo.XZone es por eso que es mejor evitar propiedades con una sola letra descapitalizada en la primera posición. –

+0

@Jesus: EL no busca el nombre del campo, pero infiere el nombre del getter. El campo es totalmente ignorado por EL. Ver también a.o. http://stackoverflow.com/q/8577545 – BalusC

+0

Sí, lo que traté de señalar es que el nombre de deters de getter infiere "XZone" como el nombre de la propiedad, entonces usted tiene la propiedad llamada xZone en java aunque XZone en jsp cuando en realidad son la misma propiedad, por lo que puede inducir posibles errores –

-1

Mi VO tiene un siguiente código

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

cuando estoy tratando de acceder a él en una página JSP como abajo, se está dando siguiente javax.el.PropertyNotFoundException error: Propiedad 'Id' no se encuentra en el tipo de DocumentPolicyVO

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

Por favor, cualquiera puede explicar la razón.

+0

Si tiene otra pregunta, por favor, haga clic en el botón [Ask Question] (// stackoverflow.com/questions/ask). –

Cuestiones relacionadas