2025-10-09 14:56
找到原因了,因为使用率CustomerCacheInterceptor,menu会缓存页面信息。
@Before(CustomerCacheInterceptor.class)
@CacheName("getMenu")
public void menu() {
}
protected void useCacheDataAndRender(Map cacheData, Controller controller) {
HttpServletRequest request = controller.getRequest();
Set> set = cacheData.entrySet();
Iterator> it = set.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
request.setAttribute((String)entry.getKey(), entry.getValue());
}
request.removeAttribute("_renderKey");
RenderInfo renderInfo = (RenderInfo)cacheData.get("_renderKey");
if (renderInfo != null) {
controller.render(renderInfo.createRender());
}
}
CustomerCacheInterceptor程序将页面缓存后,如果命中缓存会从缓存中取得信息。并覆盖掉res的国际化信息。这就导致他缓存的界面是第一次请求界面的信息,用户选的什么语言就是什么语言。另外这个还是不分用户的,其他用户进来时候取出来的语言也会是这个第一次缓存的语言数据。
当把c.setAttr(this.getResName(), res);放在了invoke之后,就表示他会执行完其他所有拦截器之后,从新把attr设置进去。
然后在TemplateRender会从新从Request里面取得新的res。
PS:这是作者有意这么控制的还是无意的啊。 I18nInterceptor故意吧c.setAttr(this.getResName(), res);放在invoke之后,然后TemplateRender,又故意从this.request.getAttributeNames();取得设置的国际化参数,再使用render方法实现的国际化。
算是国际化里面一个巨难查的隐藏BUG?
2024-05-20 10:40
@zzutligang 配置一样的话,确实没问题,我之前整过配置不一样的搞了一次。杜总说的磁盘坏道,扇区坏道还真有可能。因为你新建的数据库,磁盘扇区是不一样的。这样的话,你是不是要检查一下你的硬盘,要给服务器换一个新硬盘 了。 看样子你们服务器应该也是私域的吧。
2024-04-24 10:43
我的错,这行代码有问题,这里面是个单例模式。ExcelTemplate excel = ExcelTemplate.getInstance().readTemplatePath(this.getTemplatePath());
ExcelTemplate 的部分代码如下:
// 使用单例
private static ExcelTemplate excel = new ExcelTemplate();
private ExcelTemplate() {
}
public static ExcelTemplate getInstance() {
return excel;
}
2024-04-01 10:55
@hb963724769 循环解密还有一个问题是,系统N处用了这个地址信息。每个地方代码都要改过去,又麻烦风险又高。哪里漏改了就凉了。