简体   繁体   中英

cannot be cast to java.base/java.util.Optional

I want to implement users authentication using Spring and Angular. I tried this:

    @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());
    }

Interface:

public interface UserRepository extends CrudRepository<Users, Integer> {
    Optional<Users> findByUsername(String username);

    Optional<Users> findByEmail(String email);

    Optional<Users> findByResetCode(String code);
}

Impl:

    @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;
    }

But I get Users cannot be cast to java.base/java.util.Optional

What is the proper way to implement this? Should I use Optional or I should use just null check?

First as JB Nizet suggested, use typed query. Second use getResultList if you are not sure if the DB will always have a record for your query (since you use optional you probably dont).

Here is updated 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) );
}
  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";
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM