如何懒洋洋地加载spring-data(-neo4j)-repositories?

时间:2014-10-14 14:31:38

标签: cdi spring-data-neo4j

我在我的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>

1 个答案:

答案 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);