gpt4 book ai didi

java - 在 CDI bean 中使用 Spring Data repo 时启动挂起

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:51 25 4
gpt4 key购买 nike

我面临以下问题 - 当尝试从 CDI bean 内部访问 Spring Data 存储库时,我的应用程序在启动时挂起(未给出错误)。这是我的 repo :

import org.springframework.data.jpa.repository.JpaRepository;

public interface ConfigValueRepository extends JpaRepository<ConfigValue, ConfigValueKey> {
}

其中 ConfigValueKey:

import java.io.Serializable;

class ConfigValueKey implements Serializable {
private Long keyId;
private Long node;
}

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Initialized;
import javax.enterprise.event.Observes;
import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import node.HierarchyNode;

@ApplicationScoped
public class ConfigurationSetter {

private ConfigValueRepository configValueRepository;

@Inject
public ConfigurationSetter(ConfigValueRepository configValueRepository) {
this.configValueRepository = configValueRepository;
}

public void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
String exportLocationVar = System.getProperty("EXPORT_LOCATION");
if (StringUtils.isNotBlank(exportLocationVar)) {
configValueRepository.findById(ConfigValueKey.of(3050578512872244649L, HierarchyNode.DATACENTER_ID))
.ifPresent(v -> {
v.setValue(exportLocationVar);
configValueRepository.save(v);
});
}
}
}

有什么想法吗?我在 JBoss 上运行应用程序。

最佳答案

目前使用 CDI 配置 Spring Data Jpa 有点棘手。它并未涵盖所有典型场景。上个月,我向 Spring Data 项目推送了一个关于 CDI 配置的小请求,我已经打开了另一个请求来改进 Spring Data 组合,但直到现在我还没有关于最后一个的消息。我正在 Spring Data 项目中填写另一个问题,以讨论对更好的配置和 CDI 集成的支持,并且我制作了一个示例项目来解决一些典型的集成问题。

如果你想将 Spring Data Jpa 与 CDI 一起使用,我真的建议你看看我的 github 项目。这是一个实验,但如果他们接受,我希望将此更改发送到 Spring Data 项目。

看看 ( https://github.com/arielcarrera/cdi-spring-data-jpa-test )。

该项目涵盖了 Spring Data Jpa 与 CDI (Weld)、JTA (Narayana) 和 JPA (Hibernate) 的集成。它进行了广泛的测试,并且运行良好,正如人们所期望的那样。

换句话说,我建议你注意几点:

  • CDI 默认情况下具有惰性初始化,用于在 Spring 中启动。因此,您需要检查将 @Eager 放入您的存储库以在启动时强制初始化。
  • 关注实体管理器范围很重要。只有 @Dependent 伪作用域此时可以使用默认的 Spring Data Jpa 实现,因为它在启动时使用实体管理器,例如。发现元数据、查询和构建存储库。这一点将限制您的架构设计、事务管理和持久性上下文的共享。
  • 如果您想使用声明式事务划分 (@Transactional),您可以查看我的项目以了解如何配置自定义 Tx 拦截器。
  • 如果您希望在存储库层之上有一个事务服务层,您应该看看我对 Spring Data JPA 所做的更改。伪依赖作用域 bean 有一些限制,您需要考虑使用 @RequestScoped 或 @TransactionalScoped 实体管理器 bean 来在存储库实例之间(以及内部)共享持久性上下文。默认的 Spring Data JPA 实现(使用 @Eager 注释)在启动时使用实体管理器,因此 RequestScoped 不起作用。所以我解决了它在我的实验中更改 spring 数据代码。
  • 目前我不建议您将@RequestScoped 与JTA(Narayana) 和CDI 一起使用。它在 https://developer.jboss.org/message/990406 中发现了一个交易问题并且@TransactionalScoped 目前效果更好。
  • 检查您的日志记录配置是否正常工作并将日志记录设置为调试级别。

希望对您有所帮助。

问候。

关于java - 在 CDI bean 中使用 Spring Data repo 时启动挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57389016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com