尝试对其进行操作时获取 @autowired 实例 null,抛出空指针异常

getting @autowired intance null when try trying to do operation on it,throwing null pointer exception

我正在尝试使用 crud 存储库在 gemfire 上保存数据。我已经创建了一个操作 class 来调用存储库的保存方法,但是在自动装配实例中我得到空指针异常。下面是我的代码:

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
    }
}

因此,从您的示例中不明显的是您如何 "bootstrap" 您的应用程序及其功能(例如 Repositories)付诸行动。

添加Spring@Configuration,SpringBoot的不够简单@EnableAutoConfiguration 和 SD GemFire 的 @EnableGemfireRepositories 注释,并期望所有内容都能自动配置并成功连接。 IE。你需要一个 bootstrapping 机制,比如 Spring Boot,尤其是当你使用 @EnableAutoConfiguration 注释时。

例如...

import org.springframework.boot.SpringApplication;
...

class MyApplication {

  public static void main(String[] args) {
    SpringApplication.run(Operations.class, args);
  }
}

现在,您可以从 Operations class 中删除 @EnableAutoConfiguration 并将 @SpringBootApplication 添加到 MyApplication class,例如所以...

@SpringBootApplication
class MyApplication {
...
}

@SpringBootAppliation结合Spring的@ConfigurationSpring的 @EnableAutoConfiguration,以及许多其他有用的元注释,如 Spring 的 @ComponentScan,使各种魔法得以发生。

但是,如果您不使用 Spring Boot,您可以随时 bootstrap 使用 AnnotationConfigApplicationContext 应用程序,就像这样。 .

class MyApplication

  public static void main(String[] args) {
    AnnotationConfigApplicationContext applicationContext = 
      new AnnotationConfigApplicationContext(Operations.class);

    applicationContext.registerShutdownHook();
  }
}

这基本上就是 Spring BootSpringApplication class 为您所做的。

如果您正在开发 Web 应用程序,那么您当然可以指定创建的 ApplicationContext 的类型,因为您正在使用 Java 配置,例如。有关详细信息,请参阅 here

希望对您有所帮助!

干杯, 约翰

当我们 @Autowired 任何 class 确定时,您已将 class 声明为 @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 对您的 class 进行操作 class 其中 class 您正在调用您的 saveKeyValueData() 方法。