Un ex colega mío comenzó una discusión hace media hora sobre JavaBeans, y por qué no funcionaron del modo que él quiere en JSF. El caso particular es sobre propiedades booleanas.JavaBeans e introspección: ¿mal estado en propiedades booleanas e indexadas?
. Para una propiedad booleana denominada isUrl
Eclipse genera este
private boolean isUrl;
public boolean isUrl() {..}
public boolean setUrl(boolean url) {..}
Pero esto no funciona en JSF. Él hizo el trabajo mediante la adición de public boolean getIsUrl()
La aplicación podría ser buggy, así que asegúrese de que tiene razón, mediante el uso de la API de introspección .:
BeanInfo info = Introspector.getBeanInfo(ClassTest.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
System.out.println(pd.getName() + ": " + pd.getReadMethod() +
" : " + pd.getWriteMethod());
}
Para el código anterior, esta opción se imprime ambos métodos - es decir, Eclipse es correcto, JSF Está Mal. Pero eso me sonó sospechoso, ya que the specification no menciona nada sobre el doble "es".
Pero al revisar las especificaciones, vi algo que nunca he usado: las llamadas propiedades indexadas. Puede tener private String[] bar
y luego public String getBar(int idx)
. Entonces:
. Intenté con el Introspector
, y no encontré un método de lectura para la barra. El resultado del código anterior fue: bar: null : null
. Entonces llegué a pensar: ahora el introspector no sigue las especificaciones. Tal vez no lo siguió en el caso anterior, y en última instancia, JSF tiene razón. De hecho, las propiedades indexadas pueden hacer que haya dos métodos de lectura para una propiedad determinada. Y eso no es posible con la clase PropertyDescriptor
de la API de introspección.
¿A qué nos lleva esto? Tenemos una API posiblemente rota que no se ajusta a la especificación. Lo que lleva a otras implementaciones de la especificación (JSF usa una personalizada, obviamente). Lo que lleva a malentendidos y confusiones adicionales.
Una nota al margen de algo que me molestó - en la especificación de JavaBeans llaman a las convenciones de nomenclatura para los métodos de "patrones de diseño". Esto me suena mal.
Así pues, ahora a las preguntas:
- es el JavaBeans especificación clara
- es la API de introspección correcta
- es una especificación de nuevos JavaBeans es necesario, al menos para aclarar el comportamiento de booleanos (que es subjetivo hasta cierto punto)
Actualización. parece que el uso de JSF es bean.isUrl
en lugar de bean.url
. Lo que hace que tenga sentido no trabajar con el acceso isUrl()
.
P.S. JDK 1.6.0_20, JSF 1.2, MyFaces
tal vez algo así como las propiedades de C# serán útiles. – Bozho
Después de leer el código de introspector, isXxxx debería funcionar. El nombre del campo utilizado no importa. ¿Has probado Java 6 actualización 23? –