自然想到使用 interceptor 將每個(gè) parameter wraper 一下,加上這個(gè)屬性
我就使用 cglib 生成了一個(gè) wrapper class,然后再 proxy 到原來(lái)的 parameter 上。
后來(lái),出了錯(cuò)誤,找了好長(zhǎng)時(shí)間,發(fā)現(xiàn)
ibatis sql 中寫著 isPrimary,可其實(shí)在 java 里是這樣的
private boolean isPrimary;
public boolean isPrimary() {
return isPrimary;
}
其實(shí)屬性名字是 primary 啊,為什么在 wrapper 之前就不出錯(cuò)呢。
找了一下,ibatis 是通過(guò)他自己的 probe 來(lái)獲得屬性值的,這個(gè) probe 不僅會(huì)通過(guò)方法取值,還會(huì)通過(guò) field name 取值,沒(méi)訪問(wèn)權(quán)限的,還會(huì)加上權(quán)限。
就是 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