Fil*_*lin 3 java httprequest maven spring-boot
findAll()方法 fromJpaRepository返回空值,但正确的空值数量
我正在使用 h2 数据库,一切正常,直到某个未知时刻。简单的 GET athttp://localhost:8080/users返回 {} x 之前添加到数据库的用户数。我尝试实现一种根据用户名返回 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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是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);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用和不使用@Column注释,但它似乎没有做任何事情。
我从 Postman 得到的输出是 [{}],如果我通过createNewuser()[{},{}] 添加了两个用户等等。我不明白是什么破坏了findAll()方法。
PSupdateBalance()也不起作用,但那是其他时间。
编辑:您要求的一些 ov 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);
}
}
Run Code Online (Sandbox Code Playgroud)
和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);
}
Run Code Online (Sandbox Code Playgroud)
在我实施更新查询后,我的问题首先出现(或者我认为),但是我尝试运行一个版本,我知道它可以在另一台计算机上运行,但它没有用。
问题是您的属性是不可变的。您已经公开了 getter 和 setter,但您没有指定访问级别,并且默认情况下它们不是公开的,因此 hibernate 无法看到它们,因此无法使用从数据库返回的记录填充您的实体。将它们公开应该可以解决问题。
| 归档时间: |
|
| 查看次数: |
10067 次 |
| 最近记录: |