2019-09-21 17:13

1:删除 arp.setBaseTemplatePath(...)
2: addSqlTemplate("all.sql") 改为 addSqlTemplate("/sql/all.sql")

原因是,新版本用于 sql 管理的 Engine 对象,默认进行了如下配置:
engine.setToClassPathSourceFactory()

也就是说 engine 默认去 class path 下找模板

2019-09-21 10:37

@liugz 在每次获取 AccessToken 对象时判断一下它是否有效,无效则重新获取,这里有源码:
https://gitee.com/jfinal/jfinal-weixin/blob/master/src/main/java/com/jfinal/weixin/sdk/api/AccessTokenApi.java

getAccessToken() 调用了 getAvailableAccessToken(...),而这个方法内部的判断:
if (result != null && result.isAvailable())

如果判断为 false,上层 getAccessToken() 方法中会得到一个 null 值,随后在 synchronized 块中调用了 refreshAccessToken(...) 去远程微信服务获取新的 accessToken 值

2019-09-20 22:50

多数是 io 的问题,你将 sql 中的 select * 改成 select count(*) ,对比一下就清楚了

2019-09-20 19:54

较低的版本不支持拦截器注入, 如果是高版本,还要检查一下配置了没有:
me.setInjectDependency(true);

2019-09-20 17:40

信量太少了,具体是什么异常呢? 尤其是 cause 部分要详细

2019-09-20 16:59

@Winne 自己亲手打造的社区,热爱

楼主这个提问还算好的,这样的就纯属不遵重人了:
http://www.jfinal.com/feedback/6500

首先,该问题与 jfinal 无关。其次,正文就扔一个异常信息,对自己的问题毫不负责,对回答的人毫不遵重

2019-09-20 16:50

@tntxie 在 service 上也是类似的, 只不过 service 层上的拦截器无法通过调用下面的方法:
inv.getController()
inv.getActionKey()

这些方法可能你在生成缓存的 key 时需要使用, 但你可以换个思路解决,例如:
// 获取当前 service 的类名
String className = inv.getTarget().getClass().getName();

// 获取当前调用的方法的方法名:
String methodName = inv.getMethod().getName();

// 获取当前调用的方法的参数列表:
Class[] paraClasses = inv.getMethod().getParameterTypes();

// 获取当前调用的方法的参数值:
Object[] args = inv.getArgs();

然后通过组合上面 className、methodName、args 三个变量就可以组合得到一个可以使用的 key 值用于缓存了,paraClasses 这个变量或许还用不上

有了 className、methodName、args 三个变量,你自己再弄一个生成 key 值的工具方法,后面的代码就很好写了,与 com.jfinal.plugin.ehcache 下面的方案差不多

2019-09-20 16:33

可以完全参考 com.jfinal.plugin.ehcache 下面的设计,里头有 CacheInterceptor

逻辑是完全一样的,只不过前者将数据放 ehcache 中, 而你是需要将数据放 redis 中

jfinal 的 aop 设计,拦截器就是切面,环绕拦截的逻辑如下:

public MyInterceptor implements Interceptor {
public void intercept(Invocation inv) {
before();
inv.invoke();
after();
}

public void before() {
这里放上环绕拦截的前拦截代码
}

public void after() {
这里放上环绕拦截的后拦截代码
}

然后用 @Before 配置好就可以使用了
}

2019-09-20 16:12

文档限于篇幅,只提供基础功能,基础功能的灵活动用与组合,才能实现千变万化的功能

关键在于要先掌握基础用法,才能想到如何组合使用

2019-09-20 16:11

@一个小菜鸟 先观察一下控制台输出的 jfinal actionn reporter 的 parameter 这一栏的数据格式

然后再选择具体的 get 系列方法,如果你是传的数组,需要 for 循环,例如:
List list = new ArrayList();
for (...) {
list.add(getBean(...));
}

要根据数据的格式,灵活搭配,这里的关键是,你要先掌握文件中的各种 get 方法的用法,然后观察 jfinal action reporter 的 parameter, 再合理选择

2019-09-20 15:19

getModel 或者 getBean , 看一下文档

2019-09-20 15:18

FastController 内部使用了一个 ThreadLocal , 让每一个线程持有 controller 对象, 这样就可以重用 controller 对象,避免每次 new 出来新的对象

在一定程度上得到了单例的好处,但并不是单例

你的截图中出现多个输出,证明了不是单例, 而是每个线程会创建一个实例,如果你接受请求的线程数更多的话,会出现各多的输出

2019-09-20 14:45

Prop、PropKit 专为读配置而设计,没有打算提供写配置功能

2019-09-20 14:41

网上搜索一大把,关键词: oracle 对应 JDBC 类型

2019-09-20 14:41

@Code_Cat 使用 oracle 的 number(1) 即可,也就是说长度要是 1

https://www.cnblogs.com/softidea/p/7101091.html