Spring CrudRepository 方法 findAll() returns 一个空列表
Spring CrudRepository method findAll() returns an empty list
所以,我的问题是标题 - crudrepository 方法 findAll()
returns 一个空列表。我已经重写了 Crud 的方法,因为它返回了一个可迭代对象而不是一个列表。
我试过使用 JpaRepository
而不是 CrudRepository
(当时我没有覆盖 findAll()
方法),但得到了相同的结果。
我的代码:
Event.java
@Data
@Entity
@NoArgsConstructor
public class Event{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable=false)
private String name;
@Column(nullable=false)
private LocalDateTime time;
@ManyToOne
@JoinColumn
private City city;
}
City.java
@Data
@Entity
@NoArgsConstructor
public class City {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable=false)
private Long code;
@Column(nullable=false)
private String name;
@OneToMany(mappedBy = "city", cascade = CascadeType.ALL)
private Set<Event> events;
}
CityRepository.java
@Repository
public interface CityRepository extends CrudRepository<City, Long> {
@Override
List<City> findAll();
}
EventsController.java
@Controller
@RequestMapping
public class EventsController {
@Autowired
static CityRepository cityRepository;
public static List<Event> eventList = new ArrayList<>();
@RequestMapping
public String eventEntry(Model model) {
model.addAttribute("event", new Event());
model.addAttribute("cities", cityRepository.findAll());
return "eventEntry";
}
}
eventEntry.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Event entry</title>
</head>
<body>
<h3>New event</h3>
<form method="POST" th:object="${event}">
<div class="form-group">
<label for="city">City: </label>
<select th:field="*{city}">
<option value="" >Choose a city</option>
<option th:each="city : ${cities}" th:value="${city}" th:text="${city}"></option>
</select>
<span class="validation-error" th:if="${#fields.hasErrors('city')}" th:errors="*{city}">City Error</span>
</div>
<div class="form-group">
<label for="name">Name: </label>
<input type="text" th:field="*{name}" />
<span class="validation-error" th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</span>
</div>
<div class="form-group">
<label for="time">Time: </label>
<input type="datetime-local" th:field="*{time}" />
<span class="validation-error" th:if="${#fields.hasErrors('time')}" th:errors="*{time}">Time Error</span>
</div>
<div class="form-group">
<input type="submit" th:value="Save">
</div>
</form>
</body>
我正在使用带有 data.sql
文件的嵌入式 H2 数据库,该文件用于将数据填充到数据库中(我没有 schema.sql
文件,因为表是使用注释创建的)。
查看 H2 数据库控制台并使用 SELECT * FROM CITY
时,我得到了城市列表。
我从 EventController class 的这条线上得到一个 NullPointerException
:model.addAttribute("cities", cityRepository.findAll());
有人可以解释为什么吗?
删除了存储库前面的static
声明,现在可以正常工作了
所以,我的问题是标题 - crudrepository 方法 findAll()
returns 一个空列表。我已经重写了 Crud 的方法,因为它返回了一个可迭代对象而不是一个列表。
我试过使用 JpaRepository
而不是 CrudRepository
(当时我没有覆盖 findAll()
方法),但得到了相同的结果。
我的代码:
Event.java
@Data
@Entity
@NoArgsConstructor
public class Event{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable=false)
private String name;
@Column(nullable=false)
private LocalDateTime time;
@ManyToOne
@JoinColumn
private City city;
}
City.java
@Data
@Entity
@NoArgsConstructor
public class City {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable=false)
private Long code;
@Column(nullable=false)
private String name;
@OneToMany(mappedBy = "city", cascade = CascadeType.ALL)
private Set<Event> events;
}
CityRepository.java
@Repository
public interface CityRepository extends CrudRepository<City, Long> {
@Override
List<City> findAll();
}
EventsController.java
@Controller
@RequestMapping
public class EventsController {
@Autowired
static CityRepository cityRepository;
public static List<Event> eventList = new ArrayList<>();
@RequestMapping
public String eventEntry(Model model) {
model.addAttribute("event", new Event());
model.addAttribute("cities", cityRepository.findAll());
return "eventEntry";
}
}
eventEntry.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Event entry</title>
</head>
<body>
<h3>New event</h3>
<form method="POST" th:object="${event}">
<div class="form-group">
<label for="city">City: </label>
<select th:field="*{city}">
<option value="" >Choose a city</option>
<option th:each="city : ${cities}" th:value="${city}" th:text="${city}"></option>
</select>
<span class="validation-error" th:if="${#fields.hasErrors('city')}" th:errors="*{city}">City Error</span>
</div>
<div class="form-group">
<label for="name">Name: </label>
<input type="text" th:field="*{name}" />
<span class="validation-error" th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</span>
</div>
<div class="form-group">
<label for="time">Time: </label>
<input type="datetime-local" th:field="*{time}" />
<span class="validation-error" th:if="${#fields.hasErrors('time')}" th:errors="*{time}">Time Error</span>
</div>
<div class="form-group">
<input type="submit" th:value="Save">
</div>
</form>
</body>
我正在使用带有 data.sql
文件的嵌入式 H2 数据库,该文件用于将数据填充到数据库中(我没有 schema.sql
文件,因为表是使用注释创建的)。
查看 H2 数据库控制台并使用 SELECT * FROM CITY
时,我得到了城市列表。
我从 EventController class 的这条线上得到一个 NullPointerException
:model.addAttribute("cities", cityRepository.findAll());
有人可以解释为什么吗?
删除了存储库前面的static
声明,现在可以正常工作了