【问题标题】:Spring Boot + Hazelcast MapStore can't Autowire RepositorySpring Boot + Hazelcast MapStore 无法自动装配存储库
【发布时间】:2018-08-21 23:32:38
【问题描述】:

我开始探索 Hazelcast 的功能,并且一直在尝试通过 HazelcastRepository 将 MapStore 用作我的数据库的 Write-Behind 缓冲区。我的目标是在我的 MapStore 中使用 JpaRepository 来加载和存储到缓存中/从缓存中存储。

我正在使用 Spring Boot,在进行了一些研究后,我发现我可以使用 @SpringAware 在 MapStore 中自动装配我的存储库,但每次它到达那里时,我的 Bean 都是 null,我得到一个 NullPointerException。 即使经过许多不同的测试,我也无法让它工作,我无法在 MapStore 中自动装配我的 bean

此配置是否有问题以启用 SpringAware 还是我看错了地方?

找到This stackoverflow post,它给了我一些线索,但我仍然无法找出问题所在,因为大多数配置都是 xml 而不是 java。 还 找到这个Github Issue关于如何通过 Java 配置在 Hazelcast 中配置 SpringAware

我在Git Repo Here 中提交了我的示例代码。

【问题讨论】:

  • 我添加了一个包含主要代码片段的屏幕截图,我们可以在其中看到 @Autowired Bean 在 MapStore 中为 Null
  • 您能否通过示例修复指向您的 Git 存储库的链接?它当前指向屏幕截图
  • 修复了,我在编辑中添加截图时搞砸了。
  • 解决了什么问题?
  • 哦,我想我表达得不好,我只修复了@Kostrianlyn 在添加屏幕截图时提到的 Github 链接。

标签: spring spring-boot autowired hazelcast


【解决方案1】:

在调查了提供的代码后,我注意到 @SpringAware 在默认情况下从未启用,因为我在 Hazelcast 上发现了一个 GitHub 问题。该问题描述了 SpringAware 已被禁用,因为它影响了性能,这将我转发到另一个已关闭的票证,解决了使用 SpringManagedContext 的代码启用注释(避免使用 XML),但它没有仍然解决问题。

找到了真正的解决方案here,在你的MapStore实现中添加MapLoaderLifecycleSupport接口,并实现如ticket所示的init方法:

@Override
public void init(HazelcastInstance hazelcastInstance, Properties properties, String mapName) {
    hazelcastInstance.getConfig().getManagedContext().initialize(this);
}

这将强制在 MapStore 类中启用 @SpringAware,因此,能够将任何弹簧组件自动装配到类中,如下图所示。

working-jpa-repository-map-store-screenshot

【讨论】:

  • 这实际上工作得很好,所以我们必须拥有 SpringAware 并在 init 中“手动”设置上下文,非常棒.. 接受您的拉取请求并进行固定更改
  • 嗨..@FernandoNakano我也面临着类似的问题..所以请您提供git源代码链接..或者任何建议都会有所帮助..
【解决方案2】:

这里的问题是您正在创建名称为 pr 的 spring bean,而自动连接时您使用的是 personRepository

PersonRepository.java 中将pr 更改为personRepository 或从PersonRepository.java 中删除("pr")

@Autowired
PersonRepository personRepository; 

@Repository("pr")
public interface PersonRepository extends JpaRepository<Person, Integer> {

    @Query("SELECT id FROM Person")
    Iterable<Integer> findAllId();
}

【讨论】:

  • 好点,感谢您发现这一点,这实际上是我在做了一些测试后添加的,我删除了 @Repository 的 bean 名称但它仍然不起作用,personRepository 仍然MapStore 中的 null。
【解决方案3】:

将 MapStore bean 延迟注入初始化地图的类也可以:

    @Inject
    HazelcastConfiguration(@Lazy MyMapStore myMapStore) {
        this.myMapStore = myMapStore;
    }

在此示例中,MyMapStore bean 包含注入的 MyRepository bean。

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多