我正在努力使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没有默认构造函数的问题,这也是一个问题,但一次只有一个......