Spring Boot "Failed to execute CommandLineRunner Error"

Viewed 1332

I tried to add One To Many Annotation to my spring boot project, but when I run my project I get "Failed to execute CommandLineRunner " error. I wanted users in the user's table to have more than one city. So, I tried to add OneToMany Annotation.

You can see the error at the attachment.

User Class

package io.javabrains.springsecurity.jpa.models;
import com.spring.weather.*;

import java.util.*;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="app_user")
public class User {
    @Id
    @GeneratedValue(strategy =GenerationType.AUTO)
    private int id;
    private String userName;
    private String password;
    private boolean active;
    private String role;
    private String city;
    
    @OneToMany(targetEntity = UserCity.class,cascade = CascadeType.ALL)
    @JoinTable(name="USER_CITY",joinColumns=@JoinColumn(name="m_user_id"),
    inverseJoinColumns=@JoinColumn(name="cityId"))
    private List<UserCity> usercity;
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public List<UserCity> getUsercity() {
        return usercity;
    }
    public void setUsercity(List<UserCity> usercity) {
        this.usercity = usercity;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public boolean isActive() {
        return active;
    }
    public void setActive(boolean active) {
        this.active = active;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
    
    
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    
}

User City Class

    package io.javabrains.springsecurity.jpa.models;
    
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
    
    
    @Entity
    @Table(name="user_city")
    public class UserCity {
        @Id
        @GeneratedValue(strategy =GenerationType.AUTO)  
        private int cityId;
        private String cityName;
    
        public UserCity() {
            super();
            // TODO Auto-generated constructor stub
        }
        
    
        public UserCity(int cityId, String cityName, User mUser) {
            super();
            this.cityId = cityId;
            this.cityName = cityName;
            this.mUser = mUser;
        }
    
    
        @ManyToOne
        private User mUser;
    
        public int getCityId() {
            return cityId;
        }
    
        public void setCityId(int cityId) {
            this.cityId = cityId;
        }
    
        public String getCityName() {
            return cityName;
        }
    
        public void setCityName(String cityName) {
            this.cityName = cityName;
        }
    
        
    
        public User getmUser() {
            return mUser;
        }
    
        public void setmUser(User mUser) {
            this.mUser = mUser;
        }
    
    }

User Repository

package io.javabrains.springsecurity.jpa;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import io.javabrains.springsecurity.jpa.models.User;

public interface UserRepository extends JpaRepository<User, Integer> {
    Optional<User> findByUserName(String userName);
}

User City Repository

package io.javabrains.springsecurity.jpa;

import org.springframework.data.jpa.repository.JpaRepository;

import io.javabrains.springsecurity.jpa.models.User;
import io.javabrains.springsecurity.jpa.models.UserCity;

public interface CityRepository extends JpaRepository<UserCity,id>{
}

Spring Application Class

package io.javabrains.springsecurity.jpa;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import com.spring.weather.WeatherService;

import io.javabrains.springsecurity.jpa.models.User;
import io.javabrains.springsecurity.jpa.models.UserCity;




@SpringBootApplication
@EnableJpaRepositories(basePackageClasses = UserRepository.class)

public class SpringsecurityApplication implements CommandLineRunner{
    @Bean
    public WeatherService ws() {
        return new WeatherService ();
    }
    
    
    @Autowired
     UserRepository userRepository;
     CityRepository cityRepository;
    public static void main(String[] args) {
        SpringApplication.run(SpringsecurityApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("Application Running.");
        User adminUser= new User();
        UserCity ucity=new UserCity();
        UserCity ucity2=new UserCity();
        ucity.setCityName("amsterdam");
    
       
        
        adminUser.setUserName("Admin");
        adminUser.setPassword(new BCryptPasswordEncoder().encode("pass"));
        adminUser.setRole("ROLE_ADMIN");
        adminUser.setActive(true);
        adminUser.setCity("bologna");
        ucity.setmUser(adminUser);
        userRepository.save(adminUser);
        cityRepository.save(ucity);
        
        
        
        User newUser= new User();
        newUser.setUserName("User");
        newUser.setPassword(new BCryptPasswordEncoder().encode("pass"));
        newUser.setRole("ROLE_USER");
        newUser.setActive(true);
        newUser.setCity("maribor");
        ucity2.setmUser(newUser);
        userRepository.save(newUser);
        cityRepository.save(ucity2);
        

    }

}
1 Answers

The problem you are encountering, more specifically the NullPointerException at line 54 of your main application, is caused by the fact that the cityRepository is not instantiated.

Looking through your configuration, I see that you only register the UserRepository with the @EnableJpaRepositories annotation.

Try adding also the CityRepository to the @EnableJpaRepositories, and also specify this bean as a candidate for autowiring( also add @Autowired to this bean, as you did for UserRepository)

For a good practice, following the MVC structure, it would be nice is all your spring repositories, the beans responsible for all CRUD operations with the database to be under the same package

Related