使用BeanUtils时,Date类型值为空的解决方法

解决办法参考:[url=http://hi.baidu.com/fcp_bd/blog/item/0e632783c08836a50cf4d2c4.html/cmtid/53484428cab979f399250ad7]http://hi.baidu.com/fcp_bd/blog/item/0e632783c08836a50cf4d2c4.html/cmtid/53484428cab979f399250ad7[/url]

[color=red]org.apache.commons.beanutils.ConversionException: No value specified for 'Date'[/color]

package com.asl.cityu.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.apache.commons.beanutils.Converter;

public class DateConvert implements Converter {
private static String dateFormatStr = "yyyy/MM/dd";
private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat(dateFormatStr);

private static String dateLongFormatStr = dateFormatStr+" HH:mm:ss";
private static SimpleDateFormat dateTimeLongFormat = new SimpleDateFormat(dateLongFormatStr);

public Object convert(Class arg0, Object arg1) {
System.out.println(arg1.getClass().getName()+"="+arg1.toString());
String className = arg1.getClass().getName();
//java.sql.Timestamp
if ("java.sql.Timestamp".equalsIgnoreCase(className)) {
try {
SimpleDateFormat df = new SimpleDateFormat(dateFormatStr + " HH:mm:ss");
return df.parse(dateTimeLongFormat.format(arg1));
} catch (Exception e) {
try {
SimpleDateFormat df = new SimpleDateFormat(dateFormatStr);
return df.parse(dateTimeFormat.format(arg1));
} catch (ParseException ex) {
e.printStackTrace();
return null;
}
}
}else{//java.util.Date,java.sql.Date
String p = (String) arg1;
if (p == null || p.trim().length() == 0) {
return null;
}
try {
SimpleDateFormat df = new SimpleDateFormat(dateFormatStr + " HH:mm:ss");
return df.parse(p.trim());
} catch (Exception e) {
try {
SimpleDateFormat df = new SimpleDateFormat(dateFormatStr);
return df.parse(p.trim());
} catch (ParseException ex) {
e.printStackTrace();
return null;
}
}
}
}

public static String formatDateTime(Object obj) {
if (obj != null)
return dateTimeFormat.format(obj);
else
return "";
}

public static String formatLongDateTime(Object obj) {
if (obj != null)
return dateTimeLongFormat.format(obj);
else
return "";
}

}





package com.asl.cityu.common;

import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

public class ExtBeanUtils extends BeanUtils {
static {
ConvertUtils.register(new DateConvert(), java.util.Date.class);
ConvertUtils.register(new DateConvert(), java.sql.Date.class);
ConvertUtils.register(new DateConvert(), java.sql.Timestamp.class);
}

public static void copyProperties(Object dest, Object orig) {
try {
BeanUtils.copyProperties(dest, orig);
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InvocationTargetException ex) {
ex.printStackTrace();
}
}
}



最后调用:
ExtBeanUtils.copyProperties(toObject, fromObject);
### BeanUtils.copyProperties 只覆盖目标对象中为的属性解决方案 为了实现 `BeanUtils.copyProperties` 方法仅当源对象中的属性不为 null 才覆盖目标对象对应的属性,可以采用自定义工具类来处理这一逻辑。具体来说,在执行复制操作之前,先判断源对象的各个属性是否为 null;如果不为 null,则调用 `BeanUtils.copyProperties` 复制这些非属性。 下面是一个具体的实现方式: #### 自定义工具类 CopyUtil.java 此工具类提供了一个静态方法用于条件性地复制属性,即只有当源对象相应字段不是 null 的候才会被复制到目标对象上。 ```java import org.springframework.beans.BeanUtils; import java.lang.reflect.Field; public class CopyUtil { /** * 条件性的将source对象里的非null属性拷贝至target对象里. */ public static void copyNonNullProperties(Object source, Object target) { try { Field[] fields = source.getClass().getDeclaredFields(); for (Field field : fields) { boolean isAccessible = field.isAccessible(); field.setAccessible(true); if (field.get(source) != null && !field.getName().equals("serialVersionUID")) { // 排除序列化版本号 BeanUtils.copyProperty(target, field.getName(), field.get(source)); } field.setAccessible(isAccessible); } } catch (IllegalAccessException e) { throw new RuntimeException(e.getMessage()); } } } ``` 通过上述代码片段可以看出,该函数遍历了源对象的所有成员变量,并利用反射机制获取其实际。如果某个成员变量的不是 null 并且名称不是 "serialVersionUID"[^1] ,那么就将其赋给目标对象同名的成员变量。 这种方法有效地解决了原始问题描述中存在的情况——即防止因某些特定条件下不必要的 null 替换而破坏已有数据完整性的问题[^2] 。此外,还可以进一步扩展这个功能以支持更复杂的场景,比如忽略指定列表中的属性等。 对于 JPA 实体保存过程中遇到的部分字段更新问题,也可以借鉴类似的思路。例如,在保存实体前先查询数据库获得最新的记录作为基础版本,再基于客户端提交的新数据进行适当的选择性更新[^3] 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值