2

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

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

2 回答 2

3

当我们@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()方法。

于 2016-12-26T09:26:59.473 回答
2

因此,从您的示例中看不到的是您如何“引导”您的应用程序及其功能(例如Repositories)付诸行动。

仅仅添加Spring @ConfigurationSpring 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);
  }
}

现在,您可以@EnableAutoConfigurationOperations班级中删除 并将 加入@SpringBootApplication班级MyApplication,就像这样......

@SpringBootApplication
class MyApplication {
...
}

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

但是,如果您不使用Spring Boot,您始终可以使用 引导您的应用程序AnnotationConfigApplicationContext,就像这样..

class MyApplication

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

    applicationContext.registerShutdownHook();
  }
}

无论如何,这基本上是Spring BootSpringApplication类为您所做的。

例如,如果您正在开发 Web 应用程序,那么您当然可以指定ApplicationContextcreated 的类型,因为您使用的是 Java 配置。有关更多详细信息,请参见此处

希望这可以帮助!

干杯,约翰

于 2016-07-28T20:04:04.957 回答