浏览代码

Date convert throw expt

Looly 5 年之前
父节点
当前提交
d57de90f66

+ 1 - 0
CHANGELOG.md

@@ -17,6 +17,7 @@
 * 【core   】     SimpleCache缓存降低锁的粒度,提高并发能力(pr#1385@Github)
 * 【core   】     增加RadixUtil(pr#260@Gitee)
 * 【core   】     BeanUtil.getFieldValue支持获取字段集合(pr#254@Gitee)
+* 【core   】     DateConvert转换失败默认抛出异常(issue#I2M5GN@Gitee)
 
 ### Bug修复
 * 【core   】     修复FileUtil.move以及PathUtil.copy等无法自动创建父目录的问题(issue#I2CKTI@Gitee)

+ 55 - 30
hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java

@@ -11,7 +11,7 @@ import java.util.Date;
 
 /**
  * 日期转换器
- * 
+ *
  * @author Looly
  *
  */
@@ -24,7 +24,7 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param targetType 目标类型
 	 */
 	public DateConverter(Class<? extends java.util.Date> targetType) {
@@ -33,7 +33,7 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param targetType 目标类型
 	 * @param format 日期格式
 	 */
@@ -44,7 +44,7 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
 
 	/**
 	 * 获取日期格式
-	 * 
+	 *
 	 * @return 设置日期格式
 	 */
 	public String getFormat() {
@@ -53,7 +53,7 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
 
 	/**
 	 * 设置日期格式
-	 * 
+	 *
 	 * @param format 日期格式
 	 */
 	public void setFormat(String format) {
@@ -62,50 +62,75 @@ public class DateConverter extends AbstractConverter<java.util.Date> {
 
 	@Override
 	protected java.util.Date convertInternal(Object value) {
-		Long mills = null;
-		if (value instanceof Calendar) {
-			// Handle Calendar
-			mills = ((Calendar) value).getTimeInMillis();
+		if (value instanceof TemporalAccessor) {
+			return wrap(DateUtil.date((TemporalAccessor) value));
+		} else if (value instanceof Calendar) {
+			return wrap(DateUtil.date((Calendar) value));
 		} else if (value instanceof Number) {
-			// Handle Number
-			mills = ((Number) value).longValue();
-		}else if (value instanceof TemporalAccessor) {
-			return DateUtil.date((TemporalAccessor) value);
+			return wrap(((Number) value).longValue());
 		} else {
 			// 统一按照字符串处理
 			final String valueStr = convertToStr(value);
-			Date date = null;
-			try {
-				date = StrUtil.isBlank(this.format) //
-						? DateUtil.parse(valueStr) //
-						: DateUtil.parse(valueStr, this.format);
-			} catch (Exception e) {
-				// Ignore Exception
-			}
+			final Date date = StrUtil.isBlank(this.format) //
+					? DateUtil.parse(valueStr) //
+					: DateUtil.parse(valueStr, this.format);
 			if(null != date){
-				mills = date.getTime();
+				return wrap(date);
 			}
 		}
 
-		if (null == mills) {
-			return null;
+		throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName()));
+	}
+
+	/**
+	 * java.util.Date转为子类型
+	 * @param date Date
+	 * @return 目标类型对象
+	 */
+	private java.util.Date wrap(java.util.Date date){
+		// 返回指定类型
+		if (java.util.Date.class == targetType) {
+			return date;
+		}
+		if (DateTime.class == targetType) {
+			return DateUtil.date(date);
+		}
+		if (java.sql.Date.class == targetType) {
+			return new java.sql.Date(date.getTime());
 		}
+		if (java.sql.Time.class == targetType) {
+			return new java.sql.Time(date.getTime());
+		}
+		if (java.sql.Timestamp.class == targetType) {
+			return new java.sql.Timestamp(date.getTime());
+		}
+
+		throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName()));
+	}
 
+	/**
+	 * java.util.Date转为子类型
+	 * @param mills Date
+	 * @return 目标类型对象
+	 */
+	private java.util.Date wrap(long mills){
 		// 返回指定类型
 		if (java.util.Date.class == targetType) {
-			return new java.util.Date(mills);
+			return new Date(mills);
 		}
 		if (DateTime.class == targetType) {
-			return new DateTime(mills);
-		} else if (java.sql.Date.class == targetType) {
+			return DateUtil.date(mills);
+		}
+		if (java.sql.Date.class == targetType) {
 			return new java.sql.Date(mills);
-		} else if (java.sql.Time.class == targetType) {
+		}
+		if (java.sql.Time.class == targetType) {
 			return new java.sql.Time(mills);
-		} else if (java.sql.Timestamp.class == targetType) {
+		}
+		if (java.sql.Timestamp.class == targetType) {
 			return new java.sql.Timestamp(mills);
 		}
 
 		throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName()));
 	}
-
 }

+ 9 - 1
hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java

@@ -1,6 +1,7 @@
 package cn.hutool.core.convert;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateException;
 import cn.hutool.core.lang.TypeReference;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -11,6 +12,7 @@ import org.junit.Test;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicIntegerArray;
@@ -245,7 +247,7 @@ public class ConvertTest {
 	@Test
 	public void toClassTest(){
 		final Class<?> convert = Convert.convert(Class.class, "cn.hutool.core.convert.ConvertTest.Product");
-		Assert.assertEquals(Product.class, convert);
+		Assert.assertSame(Product.class, convert);
 	}
 
 	@Data
@@ -288,4 +290,10 @@ public class ConvertTest {
 			this.name = name;
 		}
 	}
+
+	@Test(expected = DateException.class)
+	public void toDateTest(){
+		// 默认转换失败报错而不是返回null
+		Convert.convert(Date.class, "aaaa");
+	}
 }