2017-08-08 20 views
1

JPAリポジトリを使用することはできません。だから私はプロジェクトのために何か類似のものを構築しようとしています。 は私が一般的な抽象クラスを拡張するSpring Beanの作成方法

@Repository 
public class MyEntityRepo extends CustomRepository<MyEntity, Integer> { 

} 

そして

public abstract class CustomRepository<T, ID> { 

    private static final Logger LOG =LoggerFactory.getLogger(CustomRepository.class); 

    protected SessionFactory sessionFactory; 

    private T _clazz; 
    private String className; 

    public CustomRepository() {    
     String className = _clazz.getClass().getName(); 
     if (className.contains(".")) { 
      className = className.substring(className.lastIndexOf('.') + 1); 
     } 
     LOG.info("classname:{}", className); 
    } 
} 

クラスMyEntityRepoを持っている。しかし、私はプロジェクトを開始していたときに、Springフレームワークは_clazzフィールドがヌルであるので、それはNullPointerExceptionが与えているとして、Beanを作成することができません。誰かがこれを達成する方法を説明してもらえますか?

+1

あなたはどこにもで設定していないながら_clazzはnullにすることはできませんどのように? –

+0

この '_clazz'フィールドは必要ないようです。 'String className = this.getClass()。getName();'を試してください。 – sp00m

+0

@ sp00m私は変数名を書くのが得意ではないと思います。 classNameは実際にエンティティクラスの名前を示しています。 –

答えて

0

私が知る限り、主な問題はジェネリッククラスを取得することです。あなたはorg.springframework.core.GenericTypeResolver

_clazz = (Class<T>) GenericTypeResolver.resolveTypeArgument(getClass(), CustomRepository.class); 

を使用してみてくださいT _clazz;

を保存する必要はありません

the second answer

からロジックを得ました。しかし、実際に春データは、オンザフライでのインターフェイスからプロキシを作成します。 the example

+0

SOFでの回答の順序は維持されていませんが、特定の回答を参照する場合は、質問をリンクするのではなく、直接リンクする方が良いです。 –

0

私はHibernateが使うもう1つの方法を得ました。

private Class<T> _clazz; 
    private String className; 
    public LybrateRepository() { 
     this._clazz = (Class<T>) ((ParameterizedType) getClass() 
           .getGenericSuperclass()).getActualTypeArguments()[0]; 
     String className = _clazz.getName(); 
     if (className.contains(".")) { 
      className = className.substring(className.lastIndexOf('.') + 1); 
     } 
     LOG.info("classname:{}", className); 
    } 

これは私のために働いている:)

関連する問題