Spring Boot Autowiring Repository Always Null

27,514

Solution 1

The error is instantiating a PersonService manually in your controller, like thisPersonService ps = new PersonService().

For Spring to be able to autowire anything, you need to use the beans managed by it, so instead of creating a new PersonService on your controller, autowire it:

@Autowired
private PersonService personService;

Solution 2

You should autowire your PersonService class in your controller instead of making it as an object.

Share:
27,514
aldrynshopping
Author by

aldrynshopping

Updated on July 14, 2022

Comments

  • aldrynshopping
    aldrynshopping almost 2 years

    Everytime I go inside my Service Class the Repository does not seem to be Autowired as it keep throwing NullPointerException. Can anyone help check what is it I am missing?

    Here is my code:

    DemoApplication.java

    package com.example;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.orm.jpa.EntityScan;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import org.springframework.stereotype.Controller;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Configuration
    @EnableAutoConfiguration
    @ComponentScan({"com.example", "com.controller", "com.repositories", "com.service", "com.model"})
    @EntityScan(basePackages = {"com.model"})
    @EnableJpaRepositories(basePackages = {"com.repositories"})
    @EnableTransactionManagement
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    Person.java

    package com.model;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Entity
    public class Person {
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        long id;
    
        String firstName;
    
        String lastName;
    
        public String getFirstName() {
            return firstName;
        }
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    }
    

    PersonRepository.java

    package com.repositories;
    
    import com.model.Person;
    import org.springframework.data.repository.CrudRepository;
    
    public interface PersonRepository extends CrudRepository<Person, Long> {
    
    }
    

    PersonService.java

    package com.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    
    import com.model.Person;
    import com.repositories.PersonRepository;
    
    
    @Service
    public class PersonService {
    
        private PersonRepository pr;
    
        @Autowired
        public void setPersonRepository(PersonRepository pr) {
            this.pr = pr;
        }
    
        public List<Person> listAll() {
            return null;
    
        }
    
        public Person getByName(String firstName, String lastName) {
            return null;
        }
    
        public Person saveOrUpdate(Person p) {
            pr.save(p);
            return p;
        }
    
    }
    

    application.properties

    spring.datasource.url:jdbc:h2:mem:testdb
    spring.datasource.username=sa
    spring.datasource.password=
    spring.datasource.driverClassName=org.h2.Driver
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.7</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.1-api</artifactId>
                <version>1.0.0.Final</version>
            </dependency>
    
            <dependency>
                <groupId>org.eclipse.persistence</groupId>
                <artifactId>javax.persistence</artifactId>
                <version>2.0.0</version>
                <scope>compile</scope>
            </dependency>
    
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <scope>runtime</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    

    PersonController.java

    package com.controller;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.ui.ModelMap;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.support.SessionStatus;
    
    import com.model.Person;
    import com.service.PersonService;
    
    @Controller
    public class PersonController {
        @RequestMapping("/person")
        public String person(Model model) {
            PersonService ps = new PersonService();
            Person p = ps.getByName("John", "Doe");
            model.addAttribute("person", p);
            return "personview";
        }
    
    
    
    
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String getHomePage() {
            return "homeview";
        }
    
        @RequestMapping(value = "/add", method = RequestMethod.GET)
        public String getRegFormPage(ModelMap model) {
            model.addAttribute("person", new Person());
            return "addpersonview";
        }
    
        @RequestMapping(value="/add", method = RequestMethod.POST)
        public String processRegFormPage(ModelMap model,  @ModelAttribute("person") Person p, BindingResult result, SessionStatus status, HttpServletRequest request) throws Exception {
                PersonService ps = new PersonService();
                ps.saveOrUpdate(p);
    
                model.addAttribute("person", p);
                return "personview";
            }
    }
    
  • aldrynshopping
    aldrynshopping about 8 years
    Wiring the service in Controller resolved it, will keep that in mind thanks.
  • mohit sharma
    mohit sharma almost 8 years
    @dambros thank you for sharing our insight, This worked for me as well. You saved my day
  • Usr
    Usr about 5 years
    Hi, sorry for bringing this up. I've autowired my service but then it's the service throwing nullpointer. What can I do?
  • dambros
    dambros about 5 years
    @TodorokiM I think you are better off starting a new question with the code you got because without it, it is really hard telling what can be wrong. Just too many possibilities.