我在我的JavaEE7应用程序中使用spring-data-neo4j(独立)作为不错的neo4j-OGM。
暂时,我试图通过@Autowired将spring-data-neo4j repositories集成到我的项目中。
public interface UserRepository extends GraphRepository<User> {}
我已经开始编写一些JUnit测试,它们正在测试自己使用这个存储库的bean。到目前为止一切正常。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/spring/application-context.xml" })
@Transactional
@Import(NeighborinoNeo4jConfiguration.class)
public class UserFactoryTest {
private UserFactory userFactory;
...
}
@Named
@Stateless
public class UserFactory {
@Autowired
private UserRepository userRepo;
...
}
现在,我想将这些新的存储库类集成到我的JavaEE7应用程序中,我将其部署到wildfly-8.1。
将上述UserRepository添加到我的应用程序并部署它会导致以下错误:
javax.enterprise.inject.UnsatisfiedResolutionException: Unable to resolve a bean for 'org.springframework.data.neo4j.support.mapping.Neo4jMappingContext' with qualifiers [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()].
at org.springframework.data.neo4j.repository.cdi.Neo4jCdiRepositoryExtension.createRepositoryBean(Neo4jCdiRepositoryExtension.java:109)
at org.springframework.data.neo4j.repository.cdi.Neo4jCdiRepositoryExtension.afterBeanDiscovery(Neo4jCdiRepositoryExtension.java:83)
...
让自己明确一点:只需将这个新界面添加到我的源代码并进行部署,就会在应用程序服务器中导致此错误。没有这个存储库的应用程序部署得很好。
据我所知, Neo4jCdiRepositoryExtension.createRepositoryBean()运行得太早。我有一个自己的 @ApplicationScoped -bean&#34; Application&#34;在源代码中没有此存储库的情况下,执行spring-configuration。但是添加了这个存储库,这个ApplicationScoped-bean&#34;应用程序&#34;根本没有执行;并且我假设发生 UnsatisfiedResolutionException ,因为在 Neo4jCdiRepositoryExtension 运行之前没有完成spring-configuration。我想我的问题可以通过在我的&#34; Application&#34; -bean之后完成存储库初始化来解决。
so ... 如何懒洋洋地加载spring-data-neo4j存储库?
提示#1: @NoRepositoryBean 使应用程序再次可部署。当然,我不能使用UserRepository。
import org.springframework.data.repository.NoRepositoryBean
@NoRepositoryBean
public interface UserRepository extends GraphRepository<User> {}
提示#2: @Lazy 没有帮助,同样的错误。
import org.springframework.context.annotation.Lazy;
@Lazy
public interface UserRepository extends GraphRepository<User> {
版本:
pom.xml:
<spring.version>4.0.7.RELEASE</spring.version>
<spring.data.neo4j.version>3.2.0.RELEASE</spring.data.neo4j.version>
答案 0 :(得分:0)
我终于能够开发出一种解决方法。总之,我停止使用&#34; @ Autowired&#34;完全退回到再次使用javax.inject.Inject等,我正在以老式的方式提升spring-data-neo4j&#34; ClassPathXmlApplicationContext&#34;方式。
主要的困难是找出,如何构建一个spring-data-neo4j存储库。这很容易。
// The repo you want to have an instance of.
@NoRepositoryBean // Has to be here to avoid UnsatisfiedResolutionException from question.
public interface UserRepository extends GraphRepository<User> {
}
(提示:&#34; @ NoRepositoryBean&#34;在您的存储库接口上是必需的。甚至很难删除&#34; @ EnableNeo4jRepositories(...)&#34;。)
我假设您有一个正在运行的springApplication:
final ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"spring/application-context.xml");
final Neo4jTemplate neo4jTemplate = applicationContext .getBean(Neo4jTemplate.class);
final Neo4jMappingContext neo4jMappingContext = applicationContext .getBean(Neo4jMappingContext.class);
接下来是创建一个GraphRepositoryFactory,这是构建存储库所需的:
org.springframework.data.neo4j.repository.GraphRepositoryFactory graphRepositoryFactory = new GraphRepositoryFactory(neo4jTemplate, neo4jMappingContext);
UserRepository userRepository = graphRepositoryFactory.getRepository(UserRepository.class);