尝试对它执行操作时,获取@autowired intance null,抛出空指针异常

时间:2016-07-27 08:25:07

标签: spring-boot autowired spring-data-gemfire geode

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

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

2 个答案:

答案 0 :(得分:2)

当我们@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与Operation类一起使用到您的班级 您在哪个班级调用saveKeyValueData()方法。

答案 1 :(得分:1)

因此,您的示例中不明显的是您如何“引导”您的应用程序及其功能(例如存储库)。

添加 Spring @Configuration Spring Boot的 @EnableAutoConfiguration和SD GemFire的@EnableGemfireRepositories注释并期望是不够的一切都要自动配置并成功连线。即你需要一个引导机制,比如 Spring Boot ,特别是如果你使用的是@EnableAutoConfiguration注释。

例如......

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

class MyApplication {

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

现在,您可以从@EnableAutoConfiguration课程中删除Operations,然后将@SpringBootApplication添加到MyApplication课程,就像这样......

@SpringBootApplication
class MyApplication {
...
}

@SpringBootAppliation Spring的 @Configuration Spring Boot的 @EnableAutoConfiguration结合在一起,以及许多其他有用的元注释,例如< em> Spring的 @ComponentScan,可以实现各种魔法。

但是,如果您没有使用 Spring Boot ,您可以随时使用AnnotationConfigApplicationContext引导应用程序,就像这样......

class MyApplication

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

    applicationContext.registerShutdownHook();
  }
}

这基本上是 Spring Boot SpringApplication类为你做的。

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

希望这有帮助!

干杯, 约翰