JpaRepository
的 findAll()
方法返回了空值,但是正确数量的空值。
我正在使用 h2 数据库,一切都正常工作,直到某个未知的时刻。在 http://localhost:8080/users
上进行简单的 GET 请求会返回 {}(空对象)和先前添加到数据库中的用户数。我尝试实现一个根据用户名返回 id 的方法,并且这个方法也完全正常工作。
下面是我的 User.java
:
@Entity
@Table(name = "Users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username")
@NotBlank(message = "Username is mandatory")
@Size(min = 1, max = 20, message = "Username must be less than 20 characters long")
private String username;
@Column(name = "balance")
private Double balance = 0.0;
Long getId() {
return id;
}
void setId(Long id) {
this.id = id;
}
String getUsername() {
return username;
}
void setUsername(String username) {
this.username = username;
}
Double getBalance() {
return balance;
}
void setBalance(Double balance) {
this.balance = balance;
}
}
这里是UserService
,它实现了IUserService
的方法:
@Service
public class UserService implements IUserService {
@Autowired
private UserRepository repository;
@Override
public void createNewUser(User user) {
repository.save(user);
}
@Override
public List<User> findAll() {
return repository.findAll();
}
@Override
public Long findByUsername(String username) {
return repository.findByUsername(username);
}
@Override
public User findById(Long id) {
return repository.findById(id).orElse(null);
}
@Override
public boolean checkIfUsernameIsTaken(User user) {
return repository.findByUsername(user.getUsername()) != null;
}
@Override
public void deleteUser(Long id) {
repository.deleteById(id);
}
@Override
public void updateBalance(Long id, Double balance) {
repository.updateBalance(id, balance);
}
}
我尝试使用和不使用
@Column
注释,但似乎没有产生任何作用。如果我仅通过
createNewUser()
添加一个用户,则Postman返回的输出是[{}],如果我添加了两个用户,则返回[{},{}],以此类推。我不理解是什么导致了findAll()
方法出现问题。另外,
updateBalance()
也无法正常工作,但这是另一个时间再处理。编辑:一些人要求查看
UserController
代码。@RestController
public class UserController {
@Autowired
IUserService userService;
@GetMapping("/users")
public List<User> findUsers() {
return userService.findAll();
}
@GetMapping("/users/{id}")
public User findUserById(@PathVariable Long id) {
return userService.findById(id);
}
@PostMapping("/users")
public ResponseEntity<Object> createUser(@RequestBody User user) {
if (userService.checkIfUsernameIsTaken(user)) {
Map<String, Object> response = new HashMap<>();
response.put("status", HttpStatus.NOT_ACCEPTABLE);
response.put("errors", "Username is already taken");
response.put("timestamp", new Date());
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
} else {
userService.createNewUser(user);
User currentUser = userService.findById(userService.findByUsername(user.getUsername()));
Map<String, Object> response = new HashMap<>();
response.put("id", currentUser.getId());
response.put("username", currentUser.getUsername());
response.put("balance", currentUser.getBalance());
return new ResponseEntity<>(response, HttpStatus.OK);
}
}
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
@PutMapping("/users/{id}/{balance}")
public void updateBalance(@PathVariable Long id, @PathVariable Double balance) {
userService.updateBalance(id, balance);
}
}
以及 UserRepository
:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT id FROM User WHERE username = ?1")
Long findByUsername(String username);
@Transactional
@Modifying
@Query("UPDATE User SET balance = ?2 WHERE id = ?1")
void updateBalance(Long id, Double balance);
}
据我所知,我的问题最初出现在我实现更新查询之后,但我尝试运行另一台计算机上已知可行的版本,但仍然无法正常工作。
UserRepository
的?你能同时添加这个类的代码吗? - Amit Naikoptional.get()
;整个方法可以被替换为return repository.findById(id).getOrElse(null);
。同样地,如果你打算抛出异常,那么执行显式的空检查通常被认为是嘈杂和无用的;如果你真的想这样做,使用Objects.requireNonNull(user.getUsername())
。 - chrylis -cautiouslyoptimistic-findAll
的实现。只是为了澄清一下,不要有任何假设。 - Amit NaikUserRepository extends JpaRepository<User, Long>
? - corroborator