Maison > Java > javaDidacticiel > Explication détaillée du didacticiel d'exemple de réplication d'objets d'Apache

Explication détaillée du didacticiel d'exemple de réplication d'objets d'Apache

零下一度
Libérer: 2017-06-30 09:55:01
original
1785 Les gens l'ont consulté

BeanUtils.copyProperties et PropertyUtils.copyProperties

Les deux classes d'outils traitent les propriétés portant le même nom qui existaient auparavant dans deux beans, qu'il s'agisse du bean source ou du bean cible. des attributs sont traités.

Le principe est d'obtenir et de définir dynamiquement via le mécanisme de réflexion du JDK pour convertir nos classes.

Mais vous devez faire attention aux types de données qu'ils prennent en charge. Une autre chose est que si une classe est écrite dans une classe, généralement appelée classe interne, la conversion d'une telle classe ne réussira pas.

La plus grande différence entre les deux est :
1.BeanUtils.copyProperties effectuera la conversion de type, mais pas PropertyUtils.copyProperties.
Puisque la conversion de type est effectuée, BeanUtils.copyProperties n'est pas aussi rapide que PropertyUtils.copyProperties.
Par conséquent, le champ d'application de PropertyUtils.copyProperties est légèrement plus étroit. Il copie uniquement les propriétés avec le même nom et le même type. Si le nom est le même mais le type est différent, il signalera une erreur.

2. Gestion de null : PropertyUtils prend en charge les scénarios nuls ; BeanUtils ne prend pas en charge les scénarios nuls pour certaines propriétés, notamment les suivantes :

1), le type de date n'est pas pris en charge ; 🎜>2),
Booléen, Ineger, Long, Short, Float, Double, etc. ne sont pas pris en charge : passer à false, 0 ; 3), chaîne : prise en charge, conserver

Il y a plusieurs choses à noter lors de l'utilisation de BeanUtils :

1 Pour les attributs de type Boolean/Short/Integer/Float/Double, il sera converti en false, 0. :

 1 public class User {  
 2    3     private Integer intVal;  
 4        5     private Double doubleVal;  
 6        7     private Short shortVal;  
 8        9     private Long longVal;  
10       11     private Float floatVal;  
12       13     private Byte byteVal;  
14       15     private Boolean booleanVal;  
16 }  
17   18 User src = new User();  
19 User dest = new User();  
20 BeanUtils.copyProperties(dest, src);  
21 System.out.println(src);  
22 System.out.println(dest);  
23   24 //输出结果:      25 User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null]  
26 User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false]
Copier après la connexion
Voir le code
explique que, comme ces types ont des types de base correspondants, lors de la conversion de type, il est possible de rencontrer une conversion similaire à Integer -> int. À l'heure actuelle, il est évident que l'attribut de type int ne peut pas se voir attribuer une valeur nulle, il est donc uniformément converti en 0.

Comment éviter qu'il ne tourne à 0 ? Cela peut être comme ceci :

1 import org.apache.commons.beanutils.converters.IntegerConverter;  
2   3 IntegerConverter converter = new IntegerConverter(null);    //默认为null,而不是0  4 BeanUtilsBean beanUtilsBean = new BeanUtilsBean();  
5 beanUtilsBean.getConvertUtils().register(converter, Integer.class);
Copier après la connexion
Afficher le code
2 pour java.util.Date/. BigDecimal/java Pour les classes .sql.Date/java.sql.Timestamp/java.sql.Time, si la valeur est nulle, une exception sera levée lors de la copie, et le Conveter correspondant devra être utilisé :

 1 public class User2 {  
 2    3     private java.util.Date javaUtilDateVal;  
 4        5     private java.sql.Date javaSqlDateVal;  
 6        7     private java.sql.Timestamp javaSqlTimeStampVal;  
 8        9     private BigDecimal bigDecimalVal;  
10   11     private java.sql.Time javaSqlTime;  
12   13 }  
14   15 User2 src = new User2();  
16 User2 dest = new User2();  
17   18 BeanUtilsBean beanUtilsBean = new BeanUtilsBean();  
19   20 //如果没有下面几行,则在转换null时会抛异常,例如:org.apache.commons.beanutils.ConversionException: No value specified for 'BigDecimal'  
21 //在org.apache.commons.beanutils.converters这个包下面有很多的Converter,可以按需要使用  22 beanUtilsBean.getConvertUtils().register(new BigDecimalConverter(null), BigDecimal.class);  
23 beanUtilsBean.getConvertUtils().register(new DateConverter(null), java.util.Date.class);  
24   25 beanUtilsBean.getConvertUtils().register(new SqlTimestampConverter(null), java.sql.Timestamp.class);  
26 beanUtilsBean.getConvertUtils().register(new SqlDateConverter(null), java.sql.Date.class);  
27 beanUtilsBean.getConvertUtils().register(new SqlTimeConverter(null), java.sql.Time.class);  
28   29 beanUtilsBean.copyProperties(dest, src);  
30 System.out.println(src);  
31 System.out.println(dest);
Copier après la connexion
Afficher le code
Supposons qu'il soit copié de A à B :
Exigence 1 : Si un champ dans B a une valeur (non null), alors le champ n'est pas copié ; c'est-à-dire que la copie n'est effectuée que lorsque le champ dans B n'a pas de valeur, ce qui convient pour compléter B avec une valeur.


 1 import org.apache.commons.beanutils.BeanUtilsBean;  
 2 import org.apache.commons.beanutils.PropertyUtils;  
 3    4 public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{  
 5    6     @Override  
 7     public void copyProperty(Object bean, String name, Object value)  
 8             throws IllegalAccessException, InvocationTargetException {  
 9         try {  
10             Object destValue = PropertyUtils.getSimpleProperty(bean, name);  
11             if (destValue == null) {  
12                 super.copyProperty(bean, name, value);  
13             }  
14         } catch (NoSuchMethodException e) {  
15             throw new RuntimeException(e);  
16         }  
17     }  
18   19 }
Copier après la connexion
Exigence 2 : Si un champ dans A n'a aucune valeur (est nul), alors le champ ne sera pas copié , c'est-à-dire Ne copiez pas null dans B.

 1 import org.apache.commons.beanutils.BeanUtilsBean;  
 2    3 public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean {  
 4    5     @Override  
 6     public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException {  
 7         if (value == null) {  
 8             return;  
 9         }  
10         super.copyProperty(bean, name, value);  
11     }  
12 }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal