目前项目有个需要,就是在所有查询的参数中,增加一个属性。
自然想到使用 interceptor 将每个 parameter wraper 一下,加上这个属性
我就使用 cglib 生成了一个 wrapper class,然后再 proxy 到原来的 parameter 上。
后来,出了错误,找了好长时间,发现
ibatis sql 中写着 isPrimary,可其实在 java 里是这样的
private boolean isPrimary;
public boolean isPrimary() {
return isPrimary;
}
其实属性名字是 primary 啊,为什么在 wrapper 之前就不出错呢。
找了一下,ibatis 是通过他自己的 probe 来获得属性值的,这个 probe 不仅会通过方法取值,还会通过 field name 取值,没访问权限的,还会加上权限。
就是 ClassInfo 的下面方法
private void addFields(Class clazz) {
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if (canAccessPrivateMethods()) {
try {
field.setAccessible(true);
} catch (Exception e) {
// Ignored. This is only a final precaution, nothing we can do.
}
}
if (field.isAccessible()) {
if (!setMethods.containsKey(field.getName())) {
addSetField(field);
}
if (!getMethods.containsKey(field.getName())) {
addGetField(field);
}
}
}
if (clazz.getSuperclass() != null) {
addFields(clazz.getSuperclass());
}
}
解决办法,将 isPrimary 改成 primary
posted on 2011-06-01 15:58
哈哈的日子 阅读(175)
评论(0) 编辑 收藏