重写redis.Cache 找不到定义的方法

我重写了 

  com.jfinal.plugin.redis.Cache  类   里面定义了 setexStr 方法 

  image.png

本地调试 调用  Redis.use().setexStr  可以成功

window环境下  undertow发布  提示找不到这个方法

image.png



评论区

杜福忠

2022-03-27 15:48

”重写“不是这样重写的,你这个操作叫替换,
并且undertow发布时,项目代码全部打包为jar了,
这样jfinal-undertow生产模式的ClassLoader加载器加载时就没有先后顺序了,
对业务jar一视同仁,你项目代码的jar 和 jf的jar 该类会冲突。
其次 jfinal 的Cache 也没有 setexStr 吧?以前有?

正常应该是:
public class MyCache extends com.jfinal.plugin.redis.Cache {
@Override
public String setex(Object key, int seconds, Object value) {
return xxx;
}
xxxx
}
直接启动设置:
Cache cache = new MyCache(cacheName, jedisPool, serializer, keyNamingPolicy);
Redis.addCache(cache);

或者用RedisPlugin启动设置:
new RedisPlugin(xxx){
@Override
public boolean start() {
复制RedisPlugin里面的start代码过来
Cache cache = new MyCache(this.cacheName, jedisPool, this.serializer, this.keyNamingPolicy);
Redis.addCache(cache);
return true;
}
};

业务中使用:
MyCache cache = (MyCache)Redis.use();
cache.xxx 可以调用自己定义的方法,JF的Cache没有定义得方法都可以调用了

jiangyunwei

2022-03-28 15:01

@杜福忠 感谢大佬的指导!替换后项目代码的jar 和 jf的jar 该类会冲突 他加载到了jf的jar 里面的Cache类,默认加载到第一个 后面出现相同的类就不加载。

杜福忠

2022-03-28 17:49

@jiangyunwei 理论上是可以控制jar的加载顺序,但需要特殊处理java启动参数。默认不好控制谁先加载谁后加载了。
Tomcat是/WEB-INF/classes先于/WEB-INF/lib加载,没事。
jfinal-undertow开发时也没事,也是先扫File。
但是上线时都是jar了,没特殊处理,肯定会翻车,很明显你上面报的异常就是jf的Cache类先加载了,所以才找不到 带 setexStr的方法啊。
除非上线的时候把jf里面的Cache类删除掉,这样才是保险的。但是后续的项目升级又很麻烦,jf升级了,你替换的类如果多了,处理起来是很麻烦的事情。
所以还是用extends继承吧,按推荐的来

jiangyunwei

2022-03-29 15:08

@杜福忠 好的。另外jifnal getFiles 文件上传 是不是不支持大容量文件上传,比如5G这种大文件。

杜福忠

2022-03-29 15:34

@jiangyunwei 使用JF 4.9.21版本,cos组件升级到2022.2,就支持上传2GB以上的文件了,玛雅牛大大Pull的。
@JFinal 波总文档version没有更新 https://jfinal.com/doc/3-11

jiangyunwei

2022-03-30 10:29

@杜福忠 不行把 <
!-- jfinal -->

com.jfinal
jfinal
4.9.21



com.jfinal
cos
2022.2

改成这个了,上传写成
UploadFile file = getFiles(folder,5* 1024 * 1024 * 1024).get(0);
还是报Caused by: com.oreilly.servlet.multipart.ExceededSizeException: Posted content length of 1653327211 exceeds limit of 1073741824

杜福忠

2022-03-30 10:47

@jiangyunwei
提示:超出限制大小
Posted content length of 1653327211 exceeds limit of 1073741824

按说就是这样了,if 1653327211 > 5368709120 throw
那不应该成立才对,所以你那打断点看最方便,追进去看看是什么情况,或者是不是类没更新啥的情况

jiangyunwei

2022-03-30 10:57

@杜福忠 问题找到了 我是 5*1024*1024*1024 他是int 类型的,写成长量 加 后缀l 就可以了。谢啦

杜福忠

2022-03-30 11:13

@jiangyunwei 是的,不如写成结果值,我就不喜欢写多少乘以多少整个运算,不如写结果值,再加一行汉字注释比啥都强,或者放在配置文件里面

热门反馈

扫码入社