我想使用Spring和Angular实现用户身份验证。我试过这个:
@PostMapping("request")
public ResponseEntity<?> resetRequest(@RequestBody PasswordResetDTO resetDTO) {
return userRepository.findByUsername(resetDTO.getName()).map(user -> {
if (!user.getEmail().equals(resetDTO.getEmail())) {
return new ResponseEntity<>("NAME_AND_EMAIL_MISMATCH", HttpStatus.BAD_REQUEST);
}
resetHandler.sendResetMail(user);
return ok(resetDTO);
})
.orElseGet(() -> notFound().build());
}
接口:
public interface UserRepository extends CrudRepository<Users, Integer> {
Optional<Users> findByUsername(String username);
Optional<Users> findByEmail(String email);
Optional<Users> findByResetCode(String code);
}
实施:
@Override
public Optional<Users> findByUsername(String username) {
String hql = "select e from " + Users.class.getName() + " e where e.login = ?";
Query query = entityManager.createQuery(hql).setParameter(0, username);
Optional<Users> users = (Optional<Users>) query.getSingleResult();
return users;
}
但我得到了Users cannot be cast to java.base/java.util.Optional
实现这一点的正确方法是什么?我应该使用Optional,还是应该只使用null check?
发布于 2018-10-23 03:34:20
首先,按照JB Nizet的建议,使用类型化查询。其次,如果您不确定数据库是否总是有查询的记录,请使用getResultList
(因为您使用optional,所以很可能不会)。
下面是更新后的findByUsername
@Override
public Optional<Users> findByUsername(String username) {
String hql = "select e from " + Users.class.getName() + " e where e.login = ?";
TypedQuery<Users> query = entityManager.createQuery(hql, Users.class).setParameter(0, username);
List<Users> users = query.getResultList();
return users.isEmpty() ? Optional.empty() : Optional.of( users.get(0) );
}
发布于 2021-04-05 03:09:30
public Optional<User> editUser(int id) {
return userRepository.findById(id);
}
@RequestMapping("/edit-user")
public String editUser(@RequestParam int id, HttpServletRequest request) {
Optional<User> user = userService.editUser(id);
System.out.println("user = "+user);
request.setAttribute("users", user);
request.setAttribute("mode", "MODE_UPDATE");
return "welcomepage";
}
https://stackoverflow.com/questions/52936111
复制相似问题