主要是用來設置非空對象的屬性。
1 使用BeanUtils進行設置屬性時,對於String,int可以自動轉換。比如下面的例子
常用方法
1)BeanUtils.setProperty ////復制屬性到對象中
2)BeanUtils.copyProperties //復制屬性到對象中
3)BeanUtils.populate(bean, properties) //copy map數據到bean對象中
特點:
對於設置的 Bean 對象如果沒有對應的屬性,則BeanUtils會直接忽略,對於設計工具類是有好處的。
先定義一個Person類
package pkg6; import java.util.Date; import java.text.SimpleDateFormat; public class Person { private String name; private String gender; private int age; private Date birthday; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "{name:"+name+" age:"+age+" birthday:"+birthday+"}"; } }
使用一個函數測試一下
package pkg6; import java.lang.reflect.InvocationTargetException; import org.apache.commons.beanutils.BeanUtils; public class demo1 { public static void main(String[] args) { // TODO Auto-generated method stub Person p1 = new Person(); String name = "eric"; String gender = "M"; int age = 12; String birthday = "1991-32-56"; try { BeanUtils.setProperty(p1, "name", "eric"); //BeanUtils.setProperty(p1, "birthday", birthday); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(p1); } }
它的輸出是
{name:eric age:0 birthday:null}
沒有問題。在web開發過程中經常會遇到網頁提交的用戶數據是字符串,存到數據庫中的數據是日期,那么直接進行設置會出現什么情況,如下所示
在設置屬性的代碼后面添加
BeanUtils.setProperty(p1, "birthday", birthday);
運行結果會報錯
org.apache.commons.beanutils.ConversionException: String must be in JDBC format [yyyy-MM-dd] to create a java.sql.Date
at org.apache.commons.beanutils.converters.DateTimeConverter.toDate(DateTimeConverter.java:436)
at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:343)
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156){name:eric age:0 birthday:null}
這是因為beanutils不支持字符串轉換成其他對象類型。要想轉換需要注冊一個轉換器。
ConvertUtils.register(new Converter() { public Object convert(Class type, Object value) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { return simpleDateFormat.parse(value.toString()); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }, Date.class);
當遇到java.util.Date類型時,就使用這個轉換器,將字符串轉換成Date類型。
完整的代碼如下:
package pkg6; import java.lang.reflect.InvocationTargetException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; public class demo1 { public static void main(String[] args) { // TODO Auto-generated method stub Person p1 = new Person(); String name = "eric"; String gender = "M"; int age = 12; String birthday = "1991-32-56"; ConvertUtils.register(new Converter() { public Object convert(Class type, Object value) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { return simpleDateFormat.parse(value.toString()); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }, Date.class); try { BeanUtils.setProperty(p1, "name", "eric"); BeanUtils.setProperty(p1, "birthday", birthday); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(p1); } }
運行結果如下:
{name:eric age:0 birthday:Sat Sep 25 00:00:00 CST 1993}