当前位置: 首页 > 知识库问答 >
问题:

如何延迟加载spring数据(-neo4j)-存储库?

麻书
2023-03-14

我在我的JavaEE7应用程序中使用spring-data-neo4j(独立)作为漂亮的neo4j-OGM。

目前,我正在尝试通过@Autowired将spring-data-neo4j存储库集成到我的项目中。

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“Application”,在源代码中没有这个存储库的情况下,它执行spring配置。但添加了这个存储库后,根本不会执行这个应用程序范围的bean“Application”;我假设发生了这种不满意的解决方案异常,因为在Neo4jCdiRepositoryExtension运行之前没有完成spring配置。我想我的问题可以通过在我的“应用程序”bean之后进行存储库初始化来解决。

所以如何延迟加载spring-data-neo4j存储库?

提示#1:@NoRepositoryBean使应用程序再次可部署。当然,我不能使用UserRepository。

import org.springframework.data.repository.NoRepositoryBean
@NoRepositoryBean
public interface UserRepository extends GraphRepository<User> {}

提示#2:@懒惰没有帮助,同样的错误。

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个答案

陈瀚
2023-03-14

我终于找到了一个解决办法。简而言之,我完全停止了使用“@Autowired”,转而使用javax。注射我正在以老式的“ClassPathXmlApplicationContext”方式增强spring-data-neo4j。

主要的困难是找出如何自己构建一个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> {
}

(提示:“@NoRepositoryBean”在您的存储库接口上是必需的。我甚至删除了“@EnableNeo4jRepositories(…)”

我假设您有一个正在运行的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);
 类似资料:
  • 有很多关于“懒惰”的例子和文档。也许我没有明白,但为什么要用它呢?实例化bean成本

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 问题内容: 用户在Carplay中滚动时如何延迟加载项目? 我正在使用MPPlayableContentDataSource中的beginLoadingChildItems加载 第一组项目,但是当用户滚动到 页面底部时如何调用下一页? 问题答案: The way you can achieve this is inside the following function: As Example: L

  • 问题是,每次尝试筛选表时,我的 实现中被重写的方法 都会被调用两次。 我的<代码>LazyDataModel<代码>实现: 我的xhtml视图: 和控制器

  • 问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最

  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想