2019-04-02 09:53
@海哥 实测可以解决问题。挖挖代码发现 Jfinal 中 Cache 用的是 BinaryJedis 类中相关 Redis 操作的方法,而 getJedis() 后使用 Jedis 类相关的方法。前者只支持 byte[],所以需要序列化存储对象,而 Jedis 直接支持字符串,不需要额外序列化。所以,需要注意的是,,用 Cache 缓存(序列化)的数据,必须用 Cache 读取(反序列化)。如果用 Jedis 去读取,因为没有反序列化,所以取到的值是带有序列化时的类型的(即 \xFc什么的)。。另外,需要注意的是,用 Jedis 化,获取 jedis 之后,记得 close!!!Cache 的方法都经过封装,每次操作结束后都通过 try{} finally{}关闭了,而Jedis没有。
2018-05-10 12:25
今天我也发现这个问题了,,应该是username为空。如果在web.xml中配置loginPassword和loginUsername的话,亲测是可以获取到的。理论上这个username在这里应该就是loginUsername的值,同理loginPassword.
1. 在com.alibaba.druid.support.http.ResourceServlet类的initAuthEnv()方法中,可以获取web.xml中配置loginPassword和loginUsername的值。另外,ResourceServlet这个抽象类的 service()方法中有跟报错位置相同的代码,但ResourceServlet类中的46行有`protected String username = null;`username这个属性,所以在这个类中没问题;
2. 同样是这个包下的 StatViewServlet继承了这个ResourceServlet抽象类。
3. com.jfinal.plugin.druid.DruidStatViewHandler类中35行`private StatViewServlet servlet = new JFinalStatViewServlet();`,JFinalStatViewServlet是DruidStatViewHandler的内部类,85行`class JFinalStatViewServlet extends StatViewServlet`显示它继承了com.alibaba.druid.support.http.StatViewServlet类。
4. JFinalStatViewServlet这个内部类overload重载了com.alibaba.druid.support.http.ResourceServlet中的service()方法。然而,ResourceServlet中有username属性,DruidStatViewHandler中并没有username属性,所以118行报错了。
如果没猜错的话,应该是这个原因。。
@JFinal