所以我有一个使用spring-data-neo4j的项目,遇到了一个模糊的问题。 我将java config用于spring-neo4j,Neo4jConfig.java:
@Configuration
@EnableNeo4jRepositories(basePackages = "org.neo4j.example.repository")
@EnableTransactionManagement
public class Neo4jConfig extends Neo4jConfiguration {
@Bean
public SessionFactory getSessionFactory() {
// with domain entity base package(s)
return new SessionFactory("org.neo4j.example.domain");
}
// needed for session in view in web-applications
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
return super.getSession();
}
}
我有一个DAO和一个工具,BeanDaoImpl.java:
@Repository
public class BeanDaoImpl implements BeanDao {
public String getStr() {
return "from BeanImpl";
}
}
然后我有一个使用DaoImpl的服务,请注意,自动装配的是BeanDaoImpl,而不是BeanDao :
@Service
public class MyBeanService {
@Autowired
private BeanDaoImpl daoImpl;
public String getServiceString(){
return daoImpl.getStr();
}
}
这是我的app-context.xml:
<context:component-scan base-package="com.springconflict" />
版本是springframework 4.2.5,spring-data-neo4j 4.1.11,似乎spring-data-neo4j与spring 4.2.5兼容;
这是编译错误信息:
由以下原因引起:org.springframework.beans.factory.BeanCreationException:无法自动连线字段:private com.springconflict.dao.impl.BeanDaoImpl com.springconflict.service.MyBeanService.daoImpl;嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[com.springconflict.dao.dao.impl.BeanDaoImpl]的合格Bean作为依赖项:预计至少有1个Bean可以作为此依赖项的自动装配候选。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
赔率是我删除了Neo4jConfig
或使用@Autowired BeanDao
才可以通过测试。另外,我使用普通的@Configuration
类,测试仍然通过,因此问题可能在Neo4jConfiguration
中,有人可以告诉我为什么以及如何解决此问题吗?
我无权在实际项目中将@Autowired BeanDaoImpl
更改为@Autowired BeanDao
。
答案 0 :(得分:1)
TL; DR回答:在Neo4jConfig
中定义以下其他bean,从而覆盖SDN 4.x的默认实例PersistenceExceptionTranslationPostProcessor
。
@Bean
PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
PersistenceExceptionTranslationPostProcessor p = new PersistenceExceptionTranslationPostProcessor();
p.setProxyTargetClass(true);
return p;
}
长答案:Spring Data Neo4j使用Springs PersistenceExceptionTranslationPostProcessor
将Neo4j OGM异常重新映射为Spring Data异常。这些处理器适用于类型@Repository
的所有组件。
因此,后处理程序现在在您的BeanDoaImpl
周围形成了代理,因此基本上就像另一个类。如果您使用接口,那很好用,但是如果您想将bean分配给具体的类,那就不行了。
Spring可以全局配置为创建子类,而不是创建基于标准Java接口的代理(通过使用CGLIB来实现),但是默认情况下未启用,如果使用Spring 4.2.x和Spring Data Neo4j 4.2.x,没关系,因为上面的后处理器独立于该机制。
用一个明确配置的替代它可以解决您的问题。
从体系结构的角度(或简洁的代码角度),最好是注入接口,而不是具体的类。
如果可以帮助您,请告诉我:)