一个关于addSharedObject的奇怪问题

有个普通的工具类,稍微特殊的地方就是有两个重载的方法:

public class TestUtil {

    public static String test(String name){
        return "来自test(" + name + ")";
    }
    
    public static String test(String name, String... ext){
        return "来自test(" + name + ", ...)";
    }
    
}

然后在Config中引用:

public void configEngine(Engine me) {
    me.addSharedObject("TestUtil", new kit.TestUtil());
}

在视图中调用方法:

#(TestUtil.test('xxxx'))


诡异的事情出现了:

虽然只有一个实参,但有时候却调用第二个test方法!

注意是有时,不是每次都这样,重启服务器后一般会恢复正常


另外,如果在服务端调用这个方法很稳定,从没出现过这种情况

不清楚enjoy中对于这种重载方法的引用是否有什么需要注意的

@JFinal

评论区

JFinal

2018-06-21 11:14

看一下启动时的输出,看是哪个 jfinal 版本

netwild

2018-06-21 11:31

最新的3.4

netwild

2018-06-21 11:32

实在没办法,我把两个重载的方法名称改成不一样的了,目前观察没有再出现那种问题

JFinal

2018-06-21 12:16

@netwild 应该是有老版本 jar 包在干扰,这个在 3.4 这版解决过

JFinal

2018-06-22 10:21

昨天晚上测试了一下,没有这个问题,可能是你不小心多加了参数引起的

此外,这个问题即便在老版本的 jfinal 中也是不存在的,前面我讲的老版本解决过这个问题是指另一个问题

netwild

2018-06-25 10:28

@JFinal 这个问题并不是经常出现,偶尔出现一次,所以很难跟踪

JFinal

2018-06-25 10:46

@netwild 我是手动打乱了调用次序,测试了各种情况,没有问题

你得要能重现问题,才有利于解决

我现在的猜测是你的参数本身不对,例如确实是两个或者多个参数

netwild

2018-06-25 13:46

@JFinal 这个问题来自以下的用法:

@Override
public String toJson(Object object) {
return MixedJsonFactory.me().getJson().toJson(object);
}

@Override
public String toJson(Object object, String... properties) {
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(properties);
return JSON.toJSONString(object, filter);
}


本意是重载两个序列化的方法,一个没有筛选参数,使用JFinal的JSON实现;另外一个有筛选参数,使用fashjson实现。

首先可以确定,在Controller或者Service层面调用这两个方法都是OK的
只有在enjoy中调用toJson(bean)时,偶尔会错误的进入下面那个带筛选参数的方法
传入的bean参数都是在Controller里setter进去的,可能是bean,也可能是List

我现在已将带筛选参数的方法改成别的名字了,再也没有出现过问题

netwild

2018-06-25 13:52

一直也没找到问题出现的规律
开始以为是一个多线程的Service引起的
后来把这个Service关掉了,跑了一段时间又出现了,头痛无比
@JFinal 可能还有其他因素没找到,希望我的情况是个案

JFinal

2018-06-25 18:19

@netwild 把相关所有代码都补在这个贴子里吧,估计是你的代码有问题

热门反馈

扫码入社