Java 在CDIBean中使用Spring数据repo时启动挂起

Java 在CDIBean中使用Spring数据repo时启动挂起,java,jboss,spring-data-jpa,cdi,Java,Jboss,Spring Data Jpa,Cdi,我面临以下问题-当试图从CDIBean内部访问Spring数据存储库时,我的应用程序在启动时挂起(没有给出错误)。这是我的回购协议: import org.springframework.data.jpa.repository.JpaRepository; public interface ConfigValueRepository extends JpaRepository<ConfigValue, ConfigValueKey> { } 有什么想法吗?我在JBoss上运行应用

我面临以下问题-当试图从CDIBean内部访问Spring数据存储库时,我的应用程序在启动时挂起(没有给出错误)。这是我的回购协议:

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

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

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

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

如果您想在CDI中使用SpringDataJPA,我真的建议您查看我的github项目。这是一个实验,但如果他们接受,我希望将这些更改发送给Spring数据项目

看一看()

该项目涵盖Spring数据Jpa与CDI(Weld)、JTA(Narayana)和Jpa(Hibernate)集成。它有大量的测试,并且正如人们所期望的那样工作良好

另一方面,我建议您注意以下几点:

  • 默认情况下,CDI具有延迟初始化,并在春季启动时使用。因此,您需要检查以将@Eager放到您的存储库中,以便在启动时强制初始化
  • 注意实体管理器的范围很重要。此时,只有@Dependent伪作用域可以使用默认的Spring数据Jpa实现,因为它在启动时使用实体管理器,例如发现元数据、查询和构建存储库。 这一点将限制您的体系结构设计、事务管理和持久性上下文的共享
  • 如果您想使用声明性事务划分(@transactional),您可以查看我的项目以检查如何配置自定义Tx拦截器
  • 如果您希望在存储库层上有一个事务服务层,您应该看看我对SpringDataJPA所做的更改。伪相关作用域bean有一些限制,您需要考虑@RequestScope或@TransactionalScope实体管理器bean,以便在存储库实例之间(以及内部)共享持久性上下文。默认的Spring数据JPA实现(使用@Eager注释)在启动时使用entitymanager,因此RequestScope不起作用。所以我在实验中通过改变spring数据代码解决了这个问题
  • 我不建议您现在将@RequestScope与JTA(Narayana)和CDI一起使用。它在中发现了一个事务性问题,@TransactionalScope此时工作得更好
  • 检查日志记录配置是否正常工作,并将日志记录设置为调试级别
我希望能有所帮助


注意。

您是否检查了它挂起的位置?可能错误不在这里,根据您的代码为我加载了一个简化模型(Cockbox javaee+spring)。我通过ConfigValueRepository成功地从Postgre中读取了记录。@SergZenyuk您能提供您的代码吗?我将我的项目改为使用H2 DB。请链接:我试图将@Eager添加到存储库中,但没有成功。过了一段时间,我得到了java.util.concurrent.TimeoutException。你能分享一些复制器/测试项目吗?我测试了一个类似于你的观察者方法(@Initialized(ApplicationScoped.class)),它在我的测试项目中工作。考虑提供一些录音机,也许我可以帮你做它的工作。当做
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);
                    });
        }
    }
}