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 のスコープ付きプロキシが作成されているように見えるため、これは機能しませんが、最終的にマッパーに注入されるものは依然として標準SqlSessionTemplate
であり (その周りのプロキシではありません)、何らかの形でプロキシをエスケープしています。問題の部分は、このメソッドからのようorg.mybatis.spring.SqlSessionTemplate
です...
@Override
public <T> T getMapper(Class<T> type) {
return getConfiguration().getMapper(type, this);
}
もちろん、this
ここでは元のSqlSessionTemplate
オブジェクトを参照しており、その周りのプロキシは参照していません。
スコープ プロキシをマッパーに強制する方法はありますか?
もちろん、うまくいくのは単にマッパー自体をスコープ付きプロキシにすることですが、それはエレガントで簡潔ではないようです (マッパーの自動スキャンをスキップし、代わりに各マッパーを手動で宣言する必要があります)。そのため、問題のあるオブジェクトを作成することをお勧めしますスコープ付きプロキシ。MapperProxy
それ自体はすでにシリアライズ可能であり、シリアライズできるため、SqlSessionTemplate
.
編集:もちろん、SqlSessionTemplateにデフォルトのコンストラクターが付属していないという問題もあります。これも問題になりますが、一度に1つずつ...