修复JWT自定义时间格式后的时间戳转换问题

This commit is contained in:
Looly
2023-03-03 23:26:59 +08:00
parent 2cdce52d4a
commit 3dfdd86ca0
11 changed files with 101 additions and 15 deletions

View File

@@ -38,6 +38,7 @@ import cn.hutool.core.lang.Opt;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.map.SafeConcurrentHashMap;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.ServiceLoaderUtil;
@@ -255,6 +256,11 @@ public class ConverterRegistry implements Serializable {
type = ((TypeReference<?>) type).getType();
}
// 自定义对象转换
if(value instanceof TypeConverter){
return ObjUtil.defaultIfNull((T) ((TypeConverter) value).convert(type, value), defaultValue);
}
// 标准转换器
final Converter<T> converter = getConverter(type, isCustomFirst);
if (null != converter) {

View File

@@ -0,0 +1,72 @@
package cn.hutool.core.convert;
import cn.hutool.core.convert.impl.DateConverter;
import cn.hutool.core.convert.impl.TemporalAccessorConverter;
import java.lang.reflect.Type;
import java.time.temporal.TemporalAccessor;
import java.util.Date;
/**
* 包含格式的数字转换器,主要针对带格式的时间戳
*
* @author looly
* @since 5.8.13
*/
public class NumberWithFormat extends Number implements TypeConverter{
private final Number number;
private final String format;
/**
* 构造
* @param number 数字
* @param format 格式
*/
public NumberWithFormat(final Number number, final String format) {
this.number = number;
this.format = format;
}
@SuppressWarnings("unchecked")
@Override
public Object convert(Type targetType, Object value) {
if (targetType instanceof Class) {
final Class<?> clazz = (Class<?>) targetType;
// https://gitee.com/dromara/hutool/issues/I6IS5B
if (Date.class.isAssignableFrom(clazz)) {
return new DateConverter((Class<? extends Date>) clazz, format).convert(this.number, null);
} else if (TemporalAccessor.class.isAssignableFrom(clazz)) {
return new TemporalAccessorConverter(clazz, format).convert(this.number, null);
} else if(String.class == clazz){
return toString();
}
}
throw new ConvertException("Unsupported target type {}", targetType);
}
@Override
public int intValue() {
return this.number.intValue();
}
@Override
public long longValue() {
return this.number.longValue();
}
@Override
public float floatValue() {
return this.number.floatValue();
}
@Override
public double doubleValue() {
return this.number.doubleValue();
}
@Override
public String toString() {
return this.number.toString();
}
}

View File

@@ -101,10 +101,8 @@ public class TemporalAccessorConverter extends AbstractConverter<TemporalAccesso
@Override
protected TemporalAccessor convertInternal(Object value) {
if (value instanceof Long) {
return parseFromLong((Long) value);
} else if (value instanceof Integer) {
return parseFromLong((long) (Integer) value);
if (value instanceof Number) {
return parseFromLong(((Number) value).longValue());
} else if (value instanceof TemporalAccessor) {
return parseFromTemporalAccessor((TemporalAccessor) value);
} else if (value instanceof Date) {