2013-11-21 30 views
0

我在使用Spring和Spring Data Neo4j的a new Java EE project called ACEM上工作。是否可以在不擴展GraphRepository的自定義接口上使用@Autowired?

這個問題是一個後續「Layered architecture and persistence annotations on the model beans?」,這就造成了兩個互補的行動:

  1. 改性ACEM-domain-beans使我區與接口代替彈簧數據的Neo4j註解定義類(實現已移至ACEM-dao子項目,因此所有Neo4J特定代碼都在數據訪問層項目中,這正是我想要的)。
  2. 創建一個新的DAO,其中包含對Spring Data Neo4j的零引用。

我的問題是用行動2

此刻,我的版本庫,的確都是具體到SDN,例如:

package eu.ueb.acem.dao.bleu.neo4j; 

import eu.ueb.acem.domain.beans.bleu.neo4j.BesoinNode; 

import org.springframework.data.neo4j.repository.GraphRepository; 
import org.springframework.data.neo4j.repository.RelationshipOperationsRepository; 

public interface BesoinRepository extends GraphRepository<BesoinNode>, RelationshipOperationsRepository<BesoinNode> { 

} 

如果我創建一個BesoinDAO接口隱藏此BesoinRepository接口,我想它應該是這樣的:

package eu.ueb.acem.dao.bleu; 

import eu.ueb.acem.domain.beans.bleu.Besoin; 

public interface BesoinDAO { 

    public Besoin[] retrieveAll() throws BesoinDAOException; 

    public Besoin retrieve(String name) throws BesoinDAOException; 

    public void insert(Besoin besoin) throws BesoinDAOException; 

    public void update(Besoin besoin) throws BesoinDAOException; 

    public void delete(Besoin besoin) throws BesoinDAOException; 

} 

然後:

package eu.ueb.acem.dao.bleu.neo4j; 

import eu.ueb.acem.dao.bleu.BesoinDAO; 
import eu.ueb.acem.domain.beans.bleu.neo4j.BesoinNode; 

import org.springframework.data.neo4j.repository.GraphRepository; 
import org.springframework.data.neo4j.repository.RelationshipOperationsRepository; 

public interface BesoinRepository extends BesoinDAO, GraphRepository<BesoinNode>, RelationshipOperationsRepository<BesoinNode> { 

} 

區別在於BesoinRepository現在擴展了BesoinDAO。

問題是在這裏

我寫這使用@Autowired上BesoinRepository一個測試用例,它工作得很好。但是,如果我試圖打通BesoinDAO的Besoin,如下圖所示,它不工作了:

@Autowired 
private BesoinDAO besoinDao; 

@Test 
public final void t0TestCreateBesoin() { 
    Besoin besoin1 = new BesoinNode("besoin1 for t0TestCreateBesoin"); 
    Besoin besoin2 = null; 
    try { 
     besoinDao.insert(besoin1); 
     besoin2 = besoinDao.retrieve("besoin2 for t0TestCreateBesoin"); 
    } catch (BesoinDAOException e) { 
     e.printStackTrace(); 
    } 
    assertNotNull(besoin2); 
    } 

的例外是:

Tests in error: 
t0TestCreateBesoin(eu.ueb.acem.repository.BesoinRepositoryTest): Error creating bean with name 'eu.ueb.acem.repository.BesoinRepositoryTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private eu.ueb.acem.dao.bleu.BesoinDAO eu.ueb.acem.repository.BesoinRepositoryTest.besoinDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'besoinRepository': FactoryBean threw exception on object creation; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property update found for type eu.ueb.acem.domain.beans.bleu.neo4j.BesoinNode 

問題:這是可以使用@Autowired上一個不擴展SDN的GraphRepository接口的接口?如果是這樣,怎麼樣?

謝謝!

+0

問題在於仿製藥和事實的,我們有類型擦除,這基本上讓'更新( Besoin)'覆蓋通用的一個。試試'update(<?extends Besoin> foo)'等等。但是你不是通過嘗試抽象所有東西來使事情過於複雜嗎? –

+0

感謝@ M.Deinum的回答。你能給我準確的線來代替我的'公共無效更新(Besoin besoin)拋出BesoinDAOException;'聲明?我不明白<?擴展了Besoin>,並且Eclipse也抱怨它(它聲明_a類型應該在標記「(」_)後面。爲了回答你的問題,我同意這可能看起來過於複雜,但是項目在未來會發生很大的變化,認爲這是值得的麻煩,封裝每個Neo4J特定的代碼 –

回答

0

接口可以自動裝配宣佈實施具體類的春季數據Neo4j的配置文件中,即:

<bean id="besoinDao" class="eu.ueb.acem.dao.bleu.neo4j.BesoinRepository"/> 
+0

嗨!問題是,BesoinRepository是一個接口,而不是一個類。所以我得到'錯誤創建bean名稱'besoinDao'在類路徑資源[test-context.xml]中定義:bean的實例化失敗;嵌套異常是org.springframework.beans.BeanInstantiationException:無法實例化bean類[eu.ueb.acem.dao.bleu.neo4j.BesoinRepository]:指定的類是一個接口'。 –

+0

有兩個接口(即'BesoinRepository擴展GraphRepository '和'BesoinDAO')是否有任何架構優勢? –

+1

我錯過了,你可以使用組合而不是繼承,並讓BesoinRepository(或更好的BesoinDAO)成爲一個類而不是一個接口,它可以實現DAO接口並且有一個對存儲庫的內部引用。 – remigio

相關問題