2016-07-27 39 views
1

Ich versuche, Daten auf Gemfire mit Crud Repository zu speichern. Ich habe eine Operationsklasse erstellt, um die Methode save des Repositorys aufzurufen, aber bei der autowired-Instanz erhalte ich eine Nullzeiger-Ausnahme. Unten ist mein Code:bekommen @autowired intance null, wenn versuchen, Operation auf es zu tun, werfen null Zeiger Ausnahme

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

Stellen Sie sicher, dass die Klasse GeodeRepository ordnungsgemäß kompiliert wurde. –

+0

Wird das "in" @EnableGemfireRepositories von Ihrem Code kopiert? Dies könnte das Problem sein. –

+2

Wie erhalten Sie eine Instanz von 'Operationen' und rufen' saveKeyValueData' darauf auf? –

Antwort

2

Wenn wir @Autowired jede Klasse stellen Sie sicher, haben Sie diese Klasse als @Component erklärt.

zum Beispiel:

@Component 
public class Operations { 

    @Autowired 
    private GeodeRepository repository; 

    public void saveKeyValueData(KeyValueBean keyValueBean) { 
     System.out.println("Repository is : " + repository); 
     repository.save(Arrays.asList(keyValueBean)); 
    } 
} 

und versuchen @Autowired zur Operation Klasse zu Klasse mit in welcher Klasse Ihre Ihre saveKeyValueData() Methode aufrufen.

1

Also, was aus Ihrem Beispiel nicht ersichtlich ist, wie Sie „Bootstrap“ Ihre Anwendung und es ist Funktionen (zum Beispiel Repositorys) in die Tat umzusetzen.

Es ist nicht einfach genug, um dem Frühling@Configuration, Frühling Stiefel ist@EnableAutoConfiguration und SD GemFire ​​der @EnableGemfireRepositories Anmerkungen hinzufügen und alles erwarten erfolgreich automatisch konfiguriert und verdrahtet sein. I.e. Sie benötigen einen Bootstrapping-Mechanismus, wie z. B. Spring Boot, insbesondere wenn Sie die @EnableAutoConfiguration Annotation verwenden.

Zum Beispiel ...

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

class MyApplication { 

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

Jetzt könnten Sie die @EnableAutoConfiguration von Ihrer Operations Klasse entfernen und die @SpringBootApplication zur MyApplication Klasse schreiben, so ...

@SpringBootApplication 
class MyApplication { 
... 
} 

@SpringBootAppliation Mähdrescher zusammen Spring@Configuration mit Spring Boot@EnableAutoConfiguration, zusammen mit vielen anderen nützlichen Meta-Annotationen, wie Spring's@ComponentScan, die alle Arten von Magie ermöglichen.

Aber, wenn Sie nicht Frühling Boot- verwenden, können Sie immer Ihre Anwendung Bootstrap mit den AnnotationConfigApplicationContext, wie so ..

class MyApplication 

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

    applicationContext.registerShutdownHook(); 
    } 
} 

Dies resultiert im Wesentlichen ist, was der Frühling Stiefel, SpringApplication Klasse tut für dich sowieso.

Wenn Sie eine Webanwendung entwickeln, können Sie natürlich den Typ ApplicationContext angeben, der erstellt wurde, da Sie beispielsweise Java config verwenden. Weitere Informationen finden Sie unter here.

Hoffe, das hilft!

Cheers, John