2010-04-08 18 views
12

Utilisation de Commons beanUtils Je voudrais savoir comment demander à n'importe quel convertisseur que le Dateconverter ignore les valeurs nulles et utilise null comme valeur par défaut. À titre d'exemple, considérons une classe publique,Comment demander à BeanUtils d'ignorer les valeurs nulles

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

et mon convertertest comme,

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

Les lancers au-dessus d'un NPE depuis la date se trouve être nulle. Cela me semble un scénario très primitif qui devrait être traité par défaut (comme dans, je voudrais que x2 ait une valeur nulle pour date1). Le doco me dit que je peux demander au converter de le faire. Quelqu'un peut-il m'indiquer la meilleure façon de le faire?

Je ne veux pas obtenir le convertisseur et isUseDefault() pour être vrai parce que je dois le faire pour tous les convertisseurs Date, Enum et beaucoup d'autres!

+0

http://commons.apache.org/proper/commons-beanutils/v1.8.3/apidocs/org/apache/commons/beanutils/ convertisseurs/DateConverter.html votre lien est cassé – VedX

Répondre

33

Apparemment, il semble que, il y a un moyen de dire aux ConvertUtils de ne pas lancer des exceptions sur les valeurs nulles qui est obtenue en appelant

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

Pour clarifier, vous devez exécuter cette ligne avant d'exécuter la méthode copyProperties. –

1

J'ai récemment rencontré ce problème et j'ai simplement converti ma variable en chaîne pour éviter cette erreur et l'avoir convertie en une date si nécessaire. Pas la solution la plus élégante, mais pour la simplicité et pour éviter des problèmes comme celui-ci, c'est une solution viable. L'autre inconvénient était que BeanUtils déclencherait ses méthodes avant que mes classes ne se chargent, donc j'ai opté pour cette solution plutôt qu'une solution plus compliquée au problème en utilisant des classloaders personnalisés. Par ailleurs, avant la version 1.8.0, BeanUtils lui-même ignorerait ces valeurs nulles. Voir ce lien: No value specified for 'Date' when the field is a java.util.Date with a null value pour une explication détaillée.

10

La meilleure solution est mise à jour 1.9.0 BeanUtils, car ce problème est résolu comme vous pouvez le voir ici https://issues.apache.org/jira/browse/BEANUTILS-454

+4

Ce problème se produit pour moi, et je suis sur la version 1.9.2 de commons-beanutils. – Marc

+0

J'utilisais la version 1.9.2 et la rétrogradais vers la version 1.9.0 pour mon projet. Le problème n'a pas été résolu. –

+1

Génial! Cela résout mon problème. –

0

Je suis un peu étonné qu'un tel cas simple réglage d'une valeur nulle dans un haricot, comme celui-ci :

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

provoque un comportement de plantage, comme décrit ci-dessus.

Pour ce que ça vaut la peine, voici ma solution:

import org.apache.commons.beanutils.BeanMap; 

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