有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Hazelcast映射存储中实例化对象(Jdbc模板)

我正在尝试在mapStore中自动连接jdbc模板。。但我得到了空指针异常

我做了这么多的例子,但无法解决这个问题

这是我的主课


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestCacheApplication.class, args);
        System.err.println("......running successfully......");
    }

}

这是我的缓存配置代码

@Component
public class CacheConfig {

    @Bean
    public static Config config() {

        System.err.println("config class");
        Config config = new Config();
        config.setInstanceName("hazelcast");
        
        
        MapConfig mapCfg = new MapConfig();
        mapCfg.setName("first-map");
        mapCfg.setBackupCount(2);
        mapCfg.setTimeToLiveSeconds(300);

        MapStoreConfig mapStoreCfg = new MapStoreConfig();
        mapStoreCfg.setClassName(DataMapStore .class.getName()).setEnabled(true);
        mapCfg.setMapStoreConfig(mapStoreCfg);
        config.addMapConfig(mapCfg);

        return config;

    }

}

和TblRepo实施

@Service
public class DataTblRepoImpl implements DataTblRepo {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void save(String id, String name) {

        Object[] params = new Object[] { id, name };
        int[] types = new int[] { Types.VARCHAR, Types.VARCHAR };
        String insertSql = "INSERT INTO public.person(id, name)  VALUES(?, ?)";
        jdbcTemplate.update(insertSql, params, types);
    }

和TblRepo接口,我已经用@Repository注释进行了注释

和我的地图商店类

@SpringAware
public class DataMapStore implements MapStore<String, ModelClass>{

    @Autowired
    DataTblRepo dataTblRepo;

    @Override
    public void store(String key, ModelClass value) {
        dataTblRepo.save(value.getId(), value.getName());

    }
//remaining methods will come here
}

和控制器

@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/api/v1")
public class DataController {

    @Autowired
    DataService dataService;

    HazelcastInstance hazelCast = Hazelcast.getHazelcastInstanceByName("hazelcast");

    @PostMapping("/{test}")
    public String saveDatafrom(@RequestBody ModelClass model) {

        hazelCast.getMap("first-map").put(model.getId(), model);
        return "stored";
    }

}

以下是程序流程。。启动应用程序时,将运行第一个Cacheconfig类

  • 在控制器中执行映射时。put()操作,数据将转到DataMapStore类并调用store方法将数据保存到数据库中。。由于DataTblRepo为null,因此存储方法本身的操作失败* 我还尝试在DataMapStore类中添加@component

但在我的情况下,我得到了这个错误

  • “消息”:“无法调用”com。实例演示。回购协议。数据存储。保存(字符串,字符串)“因为”这个。dataTableRepo“为空”

我在许多平台上也看到了同样的问题,但仍然无法解决这个问题

任何建议都会非常有用


共 (1) 个答案

  1. # 1 楼答案

    SpringAware用于Hazelcast分布式对象(参见documentation

    示例中的MapStore不是一个分布式对象,而是一个简单的普通对象。它应该由Spring自己管理。{cd4}应该用注释替换

    下一个问题是,映射存储配置使Hazelcast负责实例化MapStore。如果发生这种情况,您将无法从Spring的依赖项注入机制中获益。您应该直接设置Spring创建的实例

    1. Component替换SpringAware

      @Component
      public class DataMapStore implements MapStore<String, ModelClass> {
          // ...
      }
      
    2. 使用Spring配置的MapStore实例

      @Bean
      public Config config(DataMapStore mapStore) { // Ask Spring to inject the instance
      
          // ...
      
          MapStoreConfig mapStoreCfg = new MapStoreConfig();
          mapStoreCfg.setImplementation(mapStore);  // Use it
          mapCfg.setMapStoreConfig(mapStoreCfg);
          config.addMapConfig(mapCfg);
      
          return config;
      }
      

    我还删除了config()方法上的static关键字

    请注意,这种使用MapStore的方式将其与“客户机”代码耦合。这意味着您需要使用Hazelcast embedded。有关嵌入式模式与客户端/服务器的更多信息,请查看documentation related to topology