wrapper ibatis parameter 导致的问题

目前项目有个需要,就是在所有查询的参数中,增加一个属性。
自然想到使用 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

wrapper ibatis parameter 导致的问题》上有1条评论

  1. Tiger

    10ddYo. Mainly needed to place a quick note and tell you that I’ve appreciated leafing through your web and will be remncmendiog it to my friends and family. Keep up the good work! Thanks.

    回复

发表评论

电子邮件地址不会被公开。