jfinal 5.1.2 MethodKit扩展BigDecimalExt问题

addExtensionMethod(BigDecimal.class, new BigDecimalExt());

Caused by: java.lang.NullPointerException: Cannot invoke "java.util.Map.get(Object)" because "com.jfinal.template.expr.ast.MethodKit.primitiveToBoxedMap" is null

at com.jfinal.template.expr.ast.MethodKit.toBoxedType(MethodKit.java:350)

at com.jfinal.template.expr.ast.MethodKit.addExtensionMethod(MethodKit.java:286)

at com.jfinal.template.expr.ast.MethodKit.<clinit>(MethodKit.java:253)

... 21 more


评论区

杜福忠

2023-08-29 16:26

BigDecimal.class 已经内置,需要先移除再添加
Engine.removeExtensionMethod(BigDecimal.class, new BigDecimalExt());
Engine.addExtensionMethod(BigDecimal.class, new MyBigDecimalExt());

rctmlb

2023-08-29 17:11

@杜福忠问题出在初始化顺序上
private static final Map, Class>> primitiveToBoxedMap = new HashMap, Class>>(64);

// 初始化 primitive type 到 boxed type 的映射
static {
primitiveToBoxedMap.put(byte.class, Byte.class);
primitiveToBoxedMap.put(short.class, Short.class);
primitiveToBoxedMap.put(int.class, Integer.class);
primitiveToBoxedMap.put(long.class, Long.class);
primitiveToBoxedMap.put(float.class, Float.class);
primitiveToBoxedMap.put(double.class, Double.class);
primitiveToBoxedMap.put(char.class, Character.class);
primitiveToBoxedMap.put(boolean.class, Boolean.class);
}

// 以下代码实现 extension method 功能 --------------------

// 添加 jfinal 官方扩展方法 extension method
static {

addExtensionMethod(String.class, new StringExt());
addExtensionMethod(Integer.class, new IntegerExt());
addExtensionMethod(Long.class, new LongExt());
addExtensionMethod(Float.class, new FloatExt());
addExtensionMethod(Double.class, new DoubleExt());
addExtensionMethod(Short.class, new ShortExt());
addExtensionMethod(Byte.class, new ByteExt());

addExtensionMethod(BigInteger.class, new BigIntegerExt());
addExtensionMethod(BigDecimal.class, new BigDecimalExt());


}

JFinal

2023-08-29 19:36

primitiveToBoxedMap 这个对象是在 static 属性中 new 出来的,按理说不可能出现 null 值情况,你那是怎么出现的问题?请描述一下整个过程

rctmlb

2023-08-30 08:46

@JFinal 波总,仅仅更新版本之后,其它没有任何改动。跟踪Jfinal代码发现com.jfinal.template.expr.ast.MethodKit下面静态初始化顺序有问题,具体是addExtensionMethod里面用到了toBoxedType,toBoxedType里面使用了primitiveToBoxedMap,跟踪发现是NULL,如果你们发现都正常,或许可能我跟另外一个小伙伴使用了JDK17以上高版本,可能新版本跟KOTLIN一样

JFinal

2023-08-30 10:05

@rctmlb 可能是 JDK 版本的问题,你是不是没有使用 Oracle 或者 OpenJdk 的版本? 可能有些比较偏门的 JDK 发行版本会有问题

无论如何,我这边代码已经调整过了,回发头个新版本给你:
https://gitee.com/jfinal/jfinal/commit/d95792105599e239ed5e87cf49bd19e4c449b64e

rctmlb

2023-08-30 11:21

@JFinal 没有问题了👍

JFinal

2023-08-30 19:52

试用一下我提交的新版本代码,看还有没有问题,这个版本针对 BigDecimal 添加了 halfUp(int) 四舍五入功能,非常方便

热门反馈

扫码入社