2017-08-08 104 views
1

由於傳統和其他原因,我無法使用JPA存儲庫。所以我試圖爲一個項目建立類似的東西。 我有類MyEntityRepo如何讓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); 
    } 
} 

但是當我開始這個項目時,Spring框架是不能,因爲它是給NullPointerException異常,因爲_clazz字段爲空創建bean。有人可以請解釋如何實現這一目標?

+1

怎麼_clazz不能爲空,而你不是在任何地方設置? –

+0

看起來你不需要這個'_clazz'字段。嘗試'String className = this.getClass()。getName();'而不是。 – sp00m

+0

@ sp00m我想我並不擅長寫變量名。 className實際上是顯示實體類的名稱。 –

回答

0

據我所知,主要問題是獲得泛型類。

你並不需要存儲T _clazz;

嘗試使用org.springframework.core.GenericTypeResolver

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

得到了邏輯從the second answer

但實際上春季數據創建一個從飛接口代理。請參閱the example

+0

在SOF中的回答順序不被保留,如果你想引用特定的答案,最好直接鏈接答案而不是鏈接問題。 –

0

我得到了Hibernate使用的另一種方法。

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); 
    } 

這是爲我工作:)

相關問題