2010-04-08 9 views
12

Usando Commons beanUtils Me gustaría saber cómo solicitarle a cualquier conversor decir que Dateconverter ignora los valores nulos y usa null como valor predeterminado. Como ejemplo, consideremos una clase pública,Cómo pedirle a BeanUtils que ignore los valores nulos

public class X { 
    private Date date1; 
    private String string1; 
    //add public getters and setters 
} 

y mi convertertest como,

public class Apache { 

    @Test 
    public void testSimple() throws Exception { 
     X x1 = new X(), x2 = new X(); 
     x1.setString1("X"); 
     x1.setDate1(null); 
     org.apache.commons.beanutils.BeanUtils.copyProperties(x2, x1); 
     //throws ConversionException 
     System.out.println(x2.getString1()); 
     System.out.println(x2.getDate1()); 
    } 
} 

Lo anterior arroja un NPE desde la fecha pasa a ser nulo. Esto me parece un escenario muy primitivo que debería manejarse por defecto (como en, esperaría que x2 tuviera valor nulo para date1). El doco me dice que puedo pedirle al converter que haga esto. ¿Puede alguien señalarme la mejor manera de hacer esto?

No quiero agarrarme del convertidor y isUseDefault() es cierto porque luego tengo que hacerlo para todos los conversores Date, Enum y muchos otros.

+0

http://commons.apache.org/proper/commons-beanutils/v1.8.3/apidocs/org/apache/commons/beanutils/ converters/DateConverter.html su enlace está roto – VedX

Respuesta

33

Al parecer, como se ve, hay una manera de decirle a los ConvertUtils a no lanzar excepciones en los valores nulos que se consigue por llamar

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0); 
+0

Para aclarar, debe ejecutar esta línea antes de ejecutar el método copyProperties. –

1

Recientemente me encontré con este problema y simplemente convertí mi variable en una cadena para evitar este error y la convertí a una fecha cuando era necesario. No es la solución más elegante, pero por simplicidad y para evitar problemas como este, es una solución viable. La otra advertencia fue que BeanUtils lanzaría sus métodos antes de que mis clases se cargaran, por lo que opté por esta solución en lugar de una solución más complicada al problema utilizando clasificadores personalizados.

Por cierto, antes de la versión 1.8.0, BeanUtils ignoraría estos valores nulos.

Ver este enlace: No value specified for 'Date' when the field is a java.util.Date with a null value para una explicación más detallada.

10

La mejor solución es actualizar a BeanUtils 1.9.0, ya que se solucione este problema como se puede ver aquí https://issues.apache.org/jira/browse/BEANUTILS-454

+4

Este problema me está ocurriendo, y estoy en la versión 1.9.2 de commons-beanutils. – Marc

+0

Estaba usando la versión 1.9.2 y la he degradado a 1.9.0 para mi proyecto. El problema no fue resuelto –

+1

¡Genial! Soluciona mi problema –

0

Estoy un poco sorprendido de que un caso tan simple como la creación de un valor nulo en un grano, como este :

BeanUtils.setProperty(pojo, "date", null); 

provoca el bloqueo del comportamiento, como se describe anteriormente.

Por lo que vale la pena, aquí está mi solución:

import org.apache.commons.beanutils.BeanMap; 

BeanMap beanMap = new BeanMap(pojo); 
Method writeMethod = beanMap.getWriteMethod("date"); 
writeMethod.invoke(pojo, null); 
Cuestiones relacionadas