Spring Boot “Failed to execute CommandLineRunner Error”

huangapple go评论94阅读模式
英文:

Spring Boot "Failed to execute CommandLineRunner Error"

问题

  1. 我尝试为我的Spring Boot项目添加了OneToMany注解但是当我运行项目时出现了Failed to execute CommandLineRunner错误
  2. 我希望用户表中的用户可以拥有多个城市因此我尝试添加了OneToMany注解
  3. 用户类User Class
  4. package io.javabrains.springsecurity.jpa.models;
  5. import com.spring.weather.*;
  6. import java.util.*;
  7. import java.util.List;
  8. import javax.persistence.CascadeType;
  9. import javax.persistence.Entity;
  10. import javax.persistence.FetchType;
  11. import javax.persistence.GeneratedValue;
  12. import javax.persistence.GenerationType;
  13. import javax.persistence.Id;
  14. import javax.persistence.JoinColumn;
  15. import javax.persistence.JoinTable;
  16. import javax.persistence.OneToMany;
  17. import javax.persistence.Table;
  18. @Entity
  19. @Table(name="app_user")
  20. public class User {
  21. @Id
  22. @GeneratedValue(strategy = GenerationType.AUTO)
  23. private int id;
  24. private String userName;
  25. private String password;
  26. private boolean active;
  27. private String role;
  28. private String city;
  29. @OneToMany(targetEntity = UserCity.class, cascade = CascadeType.ALL)
  30. @JoinTable(name="USER_CITY", joinColumns=@JoinColumn(name="m_user_id"),
  31. inverseJoinColumns=@JoinColumn(name="cityId"))
  32. private List<UserCity> usercity;
  33. public User() {
  34. super();
  35. }
  36. // Getters and setters...
  37. }
  38. 用户城市类User City Class
  39. package io.javabrains.springsecurity.jpa.models;
  40. import javax.persistence.Entity;
  41. import javax.persistence.GeneratedValue;
  42. import javax.persistence.GenerationType;
  43. import javax.persistence.Id;
  44. import javax.persistence.ManyToOne;
  45. import javax.persistence.Table;
  46. @Entity
  47. @Table(name="user_city")
  48. public class UserCity {
  49. @Id
  50. @GeneratedValue(strategy = GenerationType.AUTO)
  51. private int cityId;
  52. private String cityName;
  53. public UserCity() {
  54. super();
  55. }
  56. // Constructors...
  57. @ManyToOne
  58. private User mUser;
  59. // Getters and setters...
  60. }
  61. 用户Repository
  62. package io.javabrains.springsecurity.jpa;
  63. import java.util.Optional;
  64. import org.springframework.data.jpa.repository.JpaRepository;
  65. import org.springframework.stereotype.Repository;
  66. import io.javabrains.springsecurity.jpa.models.User;
  67. public interface UserRepository extends JpaRepository<User, Integer> {
  68. Optional<User> findByUserName(String userName);
  69. }
  70. 用户城市Repository
  71. package io.javabrains.springsecurity.jpa;
  72. import org.springframework.data.jpa.repository.JpaRepository;
  73. import io.javabrains.springsecurity.jpa.models.User;
  74. import io.javabrains.springsecurity.jpa.models.UserCity;
  75. public interface CityRepository extends JpaRepository<UserCity, Integer> {
  76. }
  77. Spring应用类Spring Application Class
  78. package io.javabrains.springsecurity.jpa;
  79. import org.springframework.beans.factory.annotation.Autowired;
  80. import org.springframework.boot.CommandLineRunner;
  81. import org.springframework.boot.SpringApplication;
  82. import org.springframework.boot.autoconfigure.SpringBootApplication;
  83. import org.springframework.context.annotation.Bean;
  84. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  85. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  86. import com.spring.weather.WeatherService;
  87. import io.javabrains.springsecurity.jpa.models.User;
  88. import io.javabrains.springsecurity.jpa.models.UserCity;
  89. @SpringBootApplication
  90. @EnableJpaRepositories(basePackageClasses = UserRepository.class)
  91. public class SpringsecurityApplication implements CommandLineRunner {
  92. @Bean
  93. public WeatherService ws() {
  94. return new WeatherService();
  95. }
  96. @Autowired
  97. UserRepository userRepository;
  98. @Autowired
  99. CityRepository cityRepository;
  100. public static void main(String[] args) {
  101. SpringApplication.run(SpringsecurityApplication.class, args);
  102. }
  103. @Override
  104. public void run(String... args) throws Exception {
  105. // TODO Auto-generated method stub
  106. System.out.println("Application Running.");
  107. User adminUser = new User();
  108. UserCity ucity = new UserCity();
  109. UserCity ucity2 = new UserCity();
  110. ucity.setCityName("amsterdam");
  111. // 设置管理员用户信息...
  112. userRepository.save(adminUser);
  113. cityRepository.save(ucity);
  114. User newUser = new User();
  115. newUser.setUserName("User");
  116. newUser.setPassword(new BCryptPasswordEncoder().encode("pass"));
  117. newUser.setRole("ROLE_USER");
  118. newUser.setActive(true);
  119. newUser.setCity("maribor");
  120. ucity2.setmUser(newUser);
  121. userRepository.save(newUser);
  122. cityRepository.save(ucity2);
  123. }
  124. }

错误截图链接:点击此处查看错误截图

英文:

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

  1. package io.javabrains.springsecurity.jpa.models;
  2. import com.spring.weather.*;
  3. import java.util.*;
  4. import java.util.List;
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Entity;
  7. import javax.persistence.FetchType;
  8. import javax.persistence.GeneratedValue;
  9. import javax.persistence.GenerationType;
  10. import javax.persistence.Id;
  11. import javax.persistence.JoinColumn;
  12. import javax.persistence.JoinTable;
  13. import javax.persistence.OneToMany;
  14. import javax.persistence.Table;
  15. @Entity
  16. @Table(name=&quot;app_user&quot;)
  17. public class User {
  18. @Id
  19. @GeneratedValue(strategy =GenerationType.AUTO)
  20. private int id;
  21. private String userName;
  22. private String password;
  23. private boolean active;
  24. private String role;
  25. private String city;
  26. @OneToMany(targetEntity = UserCity.class,cascade = CascadeType.ALL)
  27. @JoinTable(name=&quot;USER_CITY&quot;,joinColumns=@JoinColumn(name=&quot;m_user_id&quot;),
  28. inverseJoinColumns=@JoinColumn(name=&quot;cityId&quot;))
  29. private List&lt;UserCity&gt; usercity;
  30. public User() {
  31. super();
  32. // TODO Auto-generated constructor stub
  33. }
  34. public List&lt;UserCity&gt; getUsercity() {
  35. return usercity;
  36. }
  37. public void setUsercity(List&lt;UserCity&gt; usercity) {
  38. this.usercity = usercity;
  39. }
  40. public int getId() {
  41. return id;
  42. }
  43. public void setId(int id) {
  44. this.id = id;
  45. }
  46. public String getUserName() {
  47. return userName;
  48. }
  49. public void setUserName(String userName) {
  50. this.userName = userName;
  51. }
  52. public String getPassword() {
  53. return password;
  54. }
  55. public void setPassword(String password) {
  56. this.password = password;
  57. }
  58. public boolean isActive() {
  59. return active;
  60. }
  61. public void setActive(boolean active) {
  62. this.active = active;
  63. }
  64. public String getRole() {
  65. return role;
  66. }
  67. public void setRole(String role) {
  68. this.role = role;
  69. }
  70. public String getCity() {
  71. return city;
  72. }
  73. public void setCity(String city) {
  74. this.city = city;
  75. }
  76. }

User City Class

  1. package io.javabrains.springsecurity.jpa.models;
  2. import javax.persistence.Entity;
  3. import javax.persistence.FetchType;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.JoinColumn;
  8. import javax.persistence.ManyToOne;
  9. import javax.persistence.Table;
  10. @Entity
  11. @Table(name=&quot;user_city&quot;)
  12. public class UserCity {
  13. @Id
  14. @GeneratedValue(strategy =GenerationType.AUTO)
  15. private int cityId;
  16. private String cityName;
  17. public UserCity() {
  18. super();
  19. // TODO Auto-generated constructor stub
  20. }
  21. public UserCity(int cityId, String cityName, User mUser) {
  22. super();
  23. this.cityId = cityId;
  24. this.cityName = cityName;
  25. this.mUser = mUser;
  26. }
  27. @ManyToOne
  28. private User mUser;
  29. public int getCityId() {
  30. return cityId;
  31. }
  32. public void setCityId(int cityId) {
  33. this.cityId = cityId;
  34. }
  35. public String getCityName() {
  36. return cityName;
  37. }
  38. public void setCityName(String cityName) {
  39. this.cityName = cityName;
  40. }
  41. public User getmUser() {
  42. return mUser;
  43. }
  44. public void setmUser(User mUser) {
  45. this.mUser = mUser;
  46. }
  47. }

User Repository

  1. package io.javabrains.springsecurity.jpa;
  2. import java.util.Optional;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. import io.javabrains.springsecurity.jpa.models.User;
  6. public interface UserRepository extends JpaRepository&lt;User, Integer&gt; {
  7. Optional&lt;User&gt; findByUserName(String userName);
  8. }

User City Repository

  1. package io.javabrains.springsecurity.jpa;
  2. import org.springframework.data.jpa.repository.JpaRepository;
  3. import io.javabrains.springsecurity.jpa.models.User;
  4. import io.javabrains.springsecurity.jpa.models.UserCity;
  5. public interface CityRepository extends JpaRepository&lt;UserCity,id&gt;{
  6. }

Spring Application Class

  1. package io.javabrains.springsecurity.jpa;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.CommandLineRunner;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  8. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  9. import com.spring.weather.WeatherService;
  10. import io.javabrains.springsecurity.jpa.models.User;
  11. import io.javabrains.springsecurity.jpa.models.UserCity;
  12. @SpringBootApplication
  13. @EnableJpaRepositories(basePackageClasses = UserRepository.class)
  14. public class SpringsecurityApplication implements CommandLineRunner{
  15. @Bean
  16. public WeatherService ws() {
  17. return new WeatherService ();
  18. }
  19. @Autowired
  20. UserRepository userRepository;
  21. CityRepository cityRepository;
  22. public static void main(String[] args) {
  23. SpringApplication.run(SpringsecurityApplication.class, args);
  24. }
  25. @Override
  26. public void run(String... args) throws Exception {
  27. // TODO Auto-generated method stub
  28. System.out.println(&quot;Application Running.&quot;);
  29. User adminUser= new User();
  30. UserCity ucity=new UserCity();
  31. UserCity ucity2=new UserCity();
  32. ucity.setCityName(&quot;amsterdam&quot;);
  33. adminUser.setUserName(&quot;Admin&quot;);
  34. adminUser.setPassword(new BCryptPasswordEncoder().encode(&quot;pass&quot;));
  35. adminUser.setRole(&quot;ROLE_ADMIN&quot;);
  36. adminUser.setActive(true);
  37. adminUser.setCity(&quot;bologna&quot;);
  38. ucity.setmUser(adminUser);
  39. userRepository.save(adminUser);
  40. cityRepository.save(ucity);
  41. User newUser= new User();
  42. newUser.setUserName(&quot;User&quot;);
  43. newUser.setPassword(new BCryptPasswordEncoder().encode(&quot;pass&quot;));
  44. newUser.setRole(&quot;ROLE_USER&quot;);
  45. newUser.setActive(true);
  46. newUser.setCity(&quot;maribor&quot;);
  47. ucity2.setmUser(newUser);
  48. userRepository.save(newUser);
  49. cityRepository.save(ucity2);
  50. }
  51. }

答案1

得分: 0

遇到的问题,更具体地说,在您的主应用程序的第54行出现了NullPointerException,是由于cityRepository未被实例化。

通过查看您的配置,我发现您只使用了@EnableJpaRepositories注解注册了UserRepository

尝试将CityRepository也添加到@EnableJpaRepositories中,并将此bean指定为自动连接的候选对象(就像您为UserRepository所做的那样,还要为此bean添加@Autowired)。

按照良好的实践,遵循MVC结构,最好是将所有与数据库执行CRUD操作的bean,也就是您的Spring repositories,都放在同一个包下。

英文:

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

huangapple
  • 本文由 发表于 2020年8月29日 04:29:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/63640492.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定