我正在尝试使用crud存储库在gemfire上保存数据。我创建了一个操作类来调用存储库的save方法,但在autowired实例中我得到了null指针异常。以下是我的代码:
public interface GeodeRepository extends CrudRepository<KeyValueBean, String> {
@Override
public KeyValueBean findOne(String name);
@Override
public <S extends KeyValueBean> Iterable<S> save(Iterable<S> entities);
}
@EnableGemfireRepositories(basePackageClasses = GeodeRepository.class)
@EnableAutoConfiguration
@Configuration
public class Operations {
@Autowired
private GeodeRepository repository;
public void saveKeyValueData(KeyValueBean keyValueBean) {
System.out.println("Repository is : " + repository);
repository.save(Arrays.asList(keyValueBean)); // <--- i am getting
// repository as null so
// getting null pointer
// exception
}
}
当我们@Autowired
任何类时,请确保您已将该类声明为@Component
。
例如:
@Component
public class Operations {
@Autowired
private GeodeRepository repository;
public void saveKeyValueData(KeyValueBean keyValueBean) {
System.out.println("Repository is : " + repository);
repository.save(Arrays.asList(keyValueBean));
}
}
并尝试使用@Autowired
操作类到您的类在哪个类中调用saveKeyValueData()
方法。
因此,从您的示例中不明显的是如何"引导"应用程序及其功能(例如存储库)。
仅仅添加Spring@Configuration
、Spring Boot的@EnableAutoConfiguration
和SD GemFire的@EnableGemfireRepositories
注释并期望所有内容都能自动配置并成功连接是不够的。也就是说,您需要一个引导机制,如SpringBoot,尤其是在使用@EnableAutoConfiguration
注释的情况下。
例如。。。
import org.springframework.boot.SpringApplication;
...
class MyApplication {
public static void main(String[] args) {
SpringApplication.run(Operations.class, args);
}
}
现在,您可以从Operations
类中删除@EnableAutoConfiguration
,并将@SpringBootApplication
添加到MyApplication
类中,就像这样…
@SpringBootApplication
class MyApplication {
...
}
@SpringBootApplion将Spring的@Configuration
与SpringBoot的@EnableAutoConfiguration
以及许多其他有用的元注释结合在一起,如Spring的@ComponentScan
,从而实现各种魔术。
但是,如果您不使用Spring Boot,您可以始终使用AnnotationConfigApplicationContext
引导您的应用程序,如…
class MyApplication
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(Operations.class);
applicationContext.registerShutdownHook();
}
}
这基本上就是SpringBoot,SpringApplication
类为您所做的。
例如,如果您正在开发一个Web应用程序,那么您当然可以指定由于使用Java配置而创建的ApplicationContext
的类型。请参阅此处了解更多详细信息。
希望这能有所帮助!
干杯,John