首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在重新加载Mapper XML文件时,J反演清除Mybatis拦截器

在重新加载Mapper XML文件时,J反演清除Mybatis拦截器
EN

Stack Overflow用户
提问于 2016-07-28 10:11:37
回答 1查看 1.1K关注 0票数 1

我正在为我的Spring应用程序使用Jfreer6.3.0热重加载Mybatis。我使用Java配置来配置Mybatis。

代码语言:javascript
复制
@Configuration
@ConditionalOnClass({ PageInterceptor.class })
@EnableConfigurationProperties(MybatisPageProperties.class)
@AutoConfigureBefore(MybatisAutoConfiguration.class)
public class MyBatisPageAutoConfiguration implements ApplicationContextAware {
    private static final Logger LOG = LoggerFactory.getLogger(MyBatisPageAutoConfiguration.class);

    @Autowired
    private MybatisPageProperties properties;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        BeanUtil.setApplicationContext(applicationContext);
    }

    /**
     * 
     * 
     * @return
     */
    @Bean
    public PageInterceptor pageInterceptor() {
        LOG.info("========PageInterceptor========");
        PageInterceptor pageInterceptor = new PageInterceptor();

        Properties p = new Properties();
        p.setProperty("dialect", properties.getDialect());
        p.setProperty("sqlIdRegex", properties.getSqlIdRegex());
        pageInterceptor.setProperties(p);

        return pageInterceptor;
    }

我发现在重新加载mapper xml文件时,J反演清除了拦截器。

org.zeroturnaround.jrebel.mybatis.SqlMapReloader

代码语言:javascript
复制
  private void reconfigure() {
    log.infoEcho("Reloading SQL maps");

    this.conf.reinit(); // Clear loadedResources and interceptors

    reloadedResources.set(Collections.synchronizedSet(new HashSet()));
    enterReloading();
    try {
      if (this.confBuilder != null)
        this.confBuilder.reinit();
      reconfigureAdditionalMappings();


      exitReloading();
      reloadedResources.remove();
    }
    finally
    {
      exitReloading();
      reloadedResources.remove();
    }
  }

  .........

  private void reconfigureAdditionalMappings() {
    for (ResourceDesc rd : (ResourceDesc[])this.additionalMappings.toArray(new ResourceDesc[0])) {
      reconfigureMapping(rd);
    }
  }

  private void reconfigureMapping(ResourceDesc rd) {
    org.apache.ibatis.session.Configuration c = (org.apache.ibatis.session.Configuration)this.conf;
    try { // Only reload loadedResources from Mapper XML files.
      XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(ResourceUtil.asInputStream(rd.url), c, rd.path, c.getSqlFragments());

      xmlMapperBuilder.parse();
    }
    catch (Exception e) {
      if ((e.getCause() instanceof java.io.FileNotFoundException)) removeMappingForDeletedResource(rd); else {
        throw new RuntimeException("Failed to parse mapping resource: '" + rd.url + "'", e);
      }
    } finally {
      ErrorContext.instance().reset();
    }
  }

org.zeroturnaround.jrebel.mybatis.cbp.ConfigurationCBP

代码语言:javascript
复制
public class ConfigurationCBP
  extends JavassistClassBytecodeProcessor
{
  public void process(ClassPool cp, ClassLoader cl, CtClass ctClass)
    throws Exception
  {
    ctClass.addInterface(cp.get(JrConfiguration.class.getName()));

    ctClass.addField(new CtField(cp.get(SqlMapReloader.class.getName()), "reloader", ctClass));

    CtConstructor[] constructors = ctClass.getConstructors();
    for (int i = 0; i < constructors.length; i++) {
      CtConstructor constructor = constructors[i];
      if (constructor.callsSuper()) {
        constructor.insertAfter("reloader = new " + SqlMapReloader.class.getName() + "($0);");
      }
    }

    ctClass.addMethod(CtNewMethod.make("public " + SqlMapReloader.class
      .getName() + " getReloader() {" + "  return reloader;" + "}", ctClass));




    ctClass.addMethod(CtNewMethod.make("public void reinit() {  loadedResources.clear();  ((" + JrInterceptorChain.class


      .getName() + ") interceptorChain).jrClear();" + "}", ctClass));



    ctClass.getDeclaredMethod("isResourceLoaded").insertAfter("if (reloader.doReload($1)) {  loadedResources.remove($1);  $_ = false;}");
  }
}

有什么办法让贾叛军保留拦截器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-31 01:01:55

我的项目是web应用程序,我们不需要在prod-env中进行这种更改,我们只需在dev-env中使用jar,所以只需修改从源jar获取的源文件,并将其放在src/test/java中,然后将其构建为dir类,并替换原始jar中的类。不要把它放在src/main/java文件夹中。

org.apache.ibatis.builder.xml.XMLMapperBuilder

代码语言:javascript
复制
...
public class XMLMapperBuilder extends BaseBuilder {
    private static List<Interceptor> interceptors = new ArrayList<Interceptor>(); // Added by yuanjinyong
...
    public void parse() {
...
        parsePendingStatements();

        // Added by yuanjinyong
        if (interceptors.size() == 0) {
            interceptors.addAll(configuration.getInterceptors());
        }
        if (configuration.getInterceptors().size() == 0) {
            for (Interceptor interceptor : interceptors) {
                configuration.addInterceptor(interceptor);
            }
        }
    }
...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38633389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档