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 のスコープ付きプロキシが作成されているように見えるため、これは機能しませんが、最終的にマッパーに注入されるものは依然として標準SqlSessionTemplateであり (その周りのプロキシではありません)、何らかの形でプロキシをエスケープしています。問題の部分は、このメソッドからのようorg.mybatis.spring.SqlSessionTemplateです...

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

もちろん、thisここでは元のSqlSessionTemplateオブジェクトを参照しており、その周りのプロキシは参照していません。

スコープ プロキシをマッパーに強制する方法はありますか?

もちろん、うまくいくのは単にマッパー自体をスコープ付きプロキシにすることですが、それはエレガントで簡潔ではないようです (マッパーの自動スキャンをスキップし、代わりに各マッパーを手動で宣言する必要があります)。そのため、問題のあるオブジェクトを作成することをお勧めしますスコープ付きプロキシ。MapperProxyそれ自体はすでにシリアライズ可能であり、シリアライズできるため、SqlSessionTemplate.

編集:もちろん、SqlSessionTemplateにデフォルトのコンストラクターが付属していないという問題もあります。これも問題になりますが、一度に1つずつ...

4

0 に答える 0