2011-09-23 17 views
5

Tengo un problema extraño con el método PropertyUtils.getProperty(bean, fieldName), donde obtuve un java.lang.NoShuchMethodException.PropertyUtils.getProperty falla al intentar obtener un valor de propiedad simple

Supongamos que tenemos una clase simple llamada Java POJO:

public class Pojo { 
    public java.util.Date aDate; 
    public java.util.Date theDate; 

    public Pojo(){} 
} 

y una clase de persona que llama como

public class TestPojo{ 
    public static void main(String[] args){ 
     Pojo p = new Pojo(); 
     p.setADate(new Date()); 
     p.setTheDate(new Date()); 

     PropertyUtils.getProperty(p, "theDate"); 
     PropertyUtils.getProperty(p, "aDate"); 
    } 
} 

La primera llamada PropertyUtils.getProperty funciona bien, y el segundo a la throwNoSuchMethodExeption.

me gustaría saber si me falta algo tonto o es realmente un error :)

+0

¿Qué es 'PropertyUtils'? No es una clase Java estándar. – Jesper

+0

Llamar a PropertyUtils.getProperty (p, "ADate"); funciona bien: o – nadouani

+0

es org.apache.commons.beanutils.PropertyUtils de common-beanutils – nadouani

Respuesta

4

No entiendo cómo PropertyUtils.getProperty(p, "TheDate"); podría funcionar ya que el nombre de la propiedad no es correcto.

Prueba esto:

public class TestPojo{ 
    public static void main(String[] args){ 
     Pojo p = new Pojo(); 
     p.setADate(new Date()); 
     p.setTheDate(new Date()); 

     PropertyUtils.getProperty(p, "theDate"); 
     PropertyUtils.getProperty(p, "aDate"); 
    } 
} 

Enlace a la PropertyUtils method

para resolver su problema, dos soluciones:

  • uso nombre de la propiedad en lugar
  • cambiar su método de acceso de "AFecha" nombres para getaDate() y setaDate (Date dateToSet)

Como Xavi dijo que es un reported bug

+1

tienes razón, solo fue un error tipográfico, edité la pregunta :) – nadouani

+2

@Fred +1 Gracias por su crédito, pero no es exactamente un error. Es el comportamiento de [java.beans.Introspector] (http://java.sun.com/j2se/1.5.0/docs/api/java/beans/Introspector.html), siguiendo la [Especificación de Java Beans] (http : //java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html), debido a lo cual los nombres utilizados para acceder a las propiedades se derivan de los métodos getter/setter sin importar cómo es la propiedad nombrada en el frijol. La norma establece que la primera letra se convertirá en minúsculas ** excepto ** si las dos primeras letras están en mayúscula. En este caso, el nombre permanece sin cambios. –

+1

@Fred Lo siento por todo el alboroto, pero ya sabes, cuando [deber llamadas] (http://xkcd.com/386) ... –

1

Trate

PropertyUtils.getProperty(p, "ADate"); 

en lugar de

PropertyUtils.getProperty(p, "aDate"); 
+0

bien, pero "ADate" no es el nombre del campo de Pojo. – nadouani

2

Puede ser necesario mediante:

PropertyUtils.getProperty(p, "ADate"); 

donde A in UP PERCASE

+0

getters and setters [link] (http://stackoverflow.com/questions/2036970/tutorial-on-getters-and-setters) – Ankar

6

Tome un vistazo a este bug report

El Java Bean especificación establece en la sección "8.8 Activación de nombres inferidos" que cuando el primer carácter se convierte en en minúscula, a menos que los dos primeros caracteres sean mayúsculas, el nombre de la propiedad "no se modifica".

Adaptar el resto para usted (en cursiva):

Así que cuando se tiene un método getter llamado "getADate" esto se traducido en nombre de la propiedad "AFecha" y no "aFecha".

Así que para resolver el problema tiene dos opciones:

  • usar el nombre de propiedad "AFecha" lugar o
  • cambio le nombres de los métodos a "getaDate" y "setaDate"
+0

Pensé que había encontrado un ERROR dentro de los comunes -beanutils y es la convención de denominación (en mi caso mi propiedad se llamaba "xPos") –

Cuestiones relacionadas