没有使用Spring JavaConfig的SqlSessionTemplate作用域代理

时间:2016-03-19 13:56:53

标签: spring spring-boot mybatis spring-java-config spring-mybatis

我正在努力使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的scoped代理,但最后注入Mapper的内容仍然是标准SqlSessionTemplate(而不是围绕它的代理),它以某种方式逃脱了代理。有问题的部分似乎是来自org.mybatis.spring.SqlSessionTemplate ...

的这种方法
@Override
public <T> T getMapper(Class<T> type) {
    return getConfiguration().getMapper(type, this);
}

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

有没有办法强制我的范围代理进入映射器?

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

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

0 个答案:

没有答案