2017-06-18 3 views
1

J'utilise spring boot et java configs, mais les buts @autowired ne semblent pas marcher. Je reçois un NPE, j'ai vérifié d'autres questions dans SO mais je ne peux pas voir la raison de ce comportement. Ce qui suit est mon code: -spring boot autowired null pointeur exception

package com.bhargo; 
    //skipping imports 
    @SpringBootApplication 
    public class Main implements CommandLineRunner { 

     @Autowired 
     private BuilderFactory builderFactory; 

     @Autowired 
     private LinksBuilder linksBuilder; 

     private final static File fileDir = new File("D:\\ml-20m"); 
     public static void main(String[] args) { 
      SpringApplication.run(Main.class, args); 
     } 

     @Override 
     public void run(String... args) throws Exception { 
      Main main = new Main(); 
      main.getFiles(); 
     } 

     private void getFiles() { 
      Builder[] builder = new Builder[1]; 
      Arrays.stream(fileDir.listFiles()).filter(n -> !n.getName().contains("txt") /*&& n.getName().contains("links")*/) 
        .forEach(f ->{ 
         //builder factory is NULL 
         builder[0] = builderFactory.getBuilderFor(f.getName()); 
    .... 
    .... 
@Bean 
    public BuilderFactory builderFactory() { 
     BuilderFactory builderFactory = new BuilderFactory(); 
     Map<String, Builder> map = new HashMap<>(); 
     map.put("genome-scores.csv",genomeScoreBuilder()); 
     map.put("genome-Tags.csv",genomeTagBuilder()); 
     map.put("links.csv", linksBuilder()); 
     map.put("movies.csv", movieBuilder()); 
     map.put("ratings", ratingBuilder()); 
     map.put("tags.csv", tagBuilder()); 
     builderFactory.setBuilderMap(map); 
     return builderFactory; 
    } 

La classe BuilderFactory: -

package com.bhargo.model.builder; 

import com.bhargo.Builder; 

import java.util.Map; 

public class BuilderFactory { 

    private Map<String, Builder> builderMap; 

    public BuilderFactory() { 
    } 

    public Map<String, Builder> getBuilderMap() { 
     return builderMap; 
    } 

    public void setBuilderMap(Map<String, Builder> builderMap) { 
     this.builderMap = builderMap; 
    } 

    public Builder getBuilderFor(String fileName) { 
     return builderMap.get(fileName); 
    } 
} 
+0

Pouvez-vous déplacer '@Bean public BuilderFactory builderFactory() {' méthode avant '@Autowired private BuilderFactory builderFactory;' variable membre dans la classe Main et essayez? – harshavmb

+0

ne fonctionne pas !!!!! –

+0

okies, avez-vous mis instruction sysout dans '@Bean public BuilderFactory builderFactory() {' méthode et vérifié si vous êtes en mesure d'imprimer les éléments dans la carte? Cela devrait indiquer si le bean est instancié ou non. – harshavmb

Répondre

4

Lorsque vous créez une instance d'une classe vous, comme dans la ligne suivante

Main main = new Main(); 

printemps n » Je ne connais pas l'instance et autowiring ne fonctionne pas. Dans votre cas, juste avoir la ligne

this.getFiles(); 

dans la méthode d'exécution devrait être suffisant.