spring-boot-当尝试对其执行操作时,得到@autowired intance null,抛出null指针异常



我正在尝试使用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@ConfigurationSpring 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的@ConfigurationSpringBoot的@EnableAutoConfiguration以及许多其他有用的元注释结合在一起,如Spring的@ComponentScan,从而实现各种魔术。

但是,如果您不使用Spring Boot,您可以始终使用AnnotationConfigApplicationContext引导您的应用程序,如…

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

这基本上就是SpringBootSpringApplication类为您所做的。

例如,如果您正在开发一个Web应用程序,那么您当然可以指定由于使用Java配置而创建的ApplicationContext的类型。请参阅此处了解更多详细信息。

希望这能有所帮助!

干杯,John

最新更新