2013-11-21 29 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

相关问题