是否可以在不扩展GraphRepository的自定义接口上使用@Autowired?

时间:2013-11-21 11:46:42

标签: spring spring-data spring-data-neo4j

我使用的是使用Spring和Spring Data Neo4j的a new Java EE project called ACEM

这个问题是“Layered architecture and persistence annotations on the model beans?”的后续行动,导致了两个互补的行动:

  1. 修改ACEM-domain-beans,以便使用接口而不是 Spring-Data-Neo4J-annotated 类定义我的域(实现已移至ACEM-dao子项目,以便所有特定于Neo4J的代码都在数据访问层项目中,这就是我想要的。
  2. 创建一个新的DAO,其中包含对Spring Data Neo4j的零引用。
  3. 我的问题在于行动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。

    问题在这里

    我编写了一个在BesoinRepository上使用@Autowired的测试用例,它运行良好。但如果我试图通过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
    

    问题:是否可以在不扩展SDN的GraphRepository接口的接口上使用@Autowired?如果是这样,怎么样?

    谢谢!

1 个答案:

答案 0 :(得分:0)

接口可以自动装配,声明Spring Data Neo4j配置文件中的实现具体类,即:

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