我在使用Spring和Spring Data Neo4j的a new Java EE project called ACEM上工作。是否可以在不擴展GraphRepository的自定義接口上使用@Autowired?
這個問題是一個後續「Layered architecture and persistence annotations on the model beans?」,這就造成了兩個互補的行動:
- 改性ACEM-domain-beans使我區與接口代替彈簧數據的Neo4j註解定義類(實現已移至ACEM-dao子項目,因此所有Neo4J特定代碼都在數據訪問層項目中,這正是我想要的)。
- 創建一個新的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接口的接口?如果是這樣,怎麼樣?
謝謝!
問題在於仿製藥和事實的,我們有類型擦除,這基本上讓'更新( Besoin)'覆蓋通用的一個。試試'update(<?extends Besoin> foo)'等等。但是你不是通過嘗試抽象所有東西來使事情過於複雜嗎? –
感謝@ M.Deinum的回答。你能給我準確的線來代替我的'公共無效更新(Besoin besoin)拋出BesoinDAOException;'聲明?我不明白<?擴展了Besoin>,並且Eclipse也抱怨它(它聲明_a類型應該在標記「(」_)後面。爲了回答你的問題,我同意這可能看起來過於複雜,但是項目在未來會發生很大的變化,認爲這是值得的麻煩,封裝每個Neo4J特定的代碼 –