如何在Hazelcast Map存储中实例化对象(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类将运行

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

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

  • "消息":"无法调用";com.example.demo.repo.DataTblRepository.save(String,String("因为";this.dataTableRepo";如果"为空">

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

任何建议都会非常有帮助

SpringAware用于Hazelcast分布式对象(参见文档(。

示例中的MapStore不是一个分布式对象,而是一个简单的普通对象。它应该由Spring自己管理。您应该将@SpringAware注释替换为Spring@Component注释。

下一个问题是,您的映射存储配置使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关键字。

注意,这种使用CCD_;客户端";密码这意味着您需要使用Hazelcast嵌入式。有关嵌入式模式与客户端/服务器的更多信息,请查看与拓扑结构相关的文档。

最新更新