我在使用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特定的代码 –