Amar Dev
Amar Dev

Reputation: 1479

spring boot autowired null pointer exception

I am using spring boot and java configs, buts @autowired does not seem to work. I get a NPE, I have checked other questions in SO but I cant see the reason why this behavior. Following is my code:-

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

The BuilderFactory class:-

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

Upvotes: 2

Views: 2466

Answers (1)

dunni
dunni

Reputation: 44535

When you create an instance of a class yourself, like in the following line

Main main = new Main();

Spring doesn't know about the instance and autowiring doesn't work. In your case, just having the line

this.getFiles();

in the run method should be enough.

Upvotes: 4

Related Questions