1

我正在尝试使 MyBatis Mappers 可序列化(有点)。为此,我只想SqlSessionTemplate通过 Java 配置将(这是不可序列化的东西)包装到一个作用域代理中......

@Configuration
@MapperScan(basePackages={"com.example.mybatis.mappers"}, sqlSessionTemplateRef="sqlSession")
public class SpringConfiguration {

    @Bean
    @Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)
    public SqlSessionTemplate sqlSession(final SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

不幸的是,这不起作用,因为似乎要创建 SqlSessionTemplate 的范围代理,但最终注入 Mapper 的仍然是一个标准SqlSessionTemplate(而不是它周围的代理),它以某种方式逃脱了代理。有问题的部分似乎是这种方法org.mybatis.spring.SqlSessionTemplate......

@Override
public <T> T getMapper(Class<T> type) {
    return getConfiguration().getMapper(type, this);
}

当然,this这里指的是原始SqlSessionTemplate对象,而不是它周围的 Proxy。

有没有办法强制我的作用域代理进入映射器?

当然,有效的方法是简单地使映射器本身成为范围代理,但这似乎不太优雅和简洁(并且需要我跳过对映射器的自动扫描,而是手动声明每个映射器),所以我更愿意制作有问题的对象一个作用域代理,因为它MapperProxy本身已经是可序列化的并且可以被序列化 - 它只是被SqlSessionTemplate.

编辑:当然还有一个问题是SqlSessionTemplate 没有默认构造函数,这也是一个问题,但一次一个......

4

0 回答 0