首页 > 解决方案 > 如何在SpringBoot中验证用户是否存在而没有Optional

问题描述

我有 SpringBoot 应用程序,用户可以使用电子邮件和用户名进行注册。我可以使用可选的 isPresent() 方法验证电子邮件是否已正确存在于数据库中,但我不能对用户名执行相同操作,因为我在我需要的项目中使用了 UserDetailsS​​erviceImpl.java 中的 UserDetailsS​​ervice。

当我有AppUserRepo.java

AppUser findByUsername(String username);
Optional<AppUser> findByEmail(String email);

代替

Optional<AppUser> findByUsername(String username); 

一切正常,但我无法验证用户名是否已经存在。
当我有

Optional<AppUser> findByUsername(String username);

我收到错误,它说我必须更改Optional<AppUser>To AppUser

我怎么解决这个问题?

我的 AppUser 存储库 - AppUserRepo.java


import java.util.Optional;

@Repository
public interface AppUserRepo extends JpaRepository<AppUser, Long> {

    AppUser findByUsername(String username);
    Optional<AppUser> findByEmail(String email);

}

当我想使用时Optional<AppUser> findByUsername(String username);,我的 UserService.java 中出现错误

用户服务.java


@Service
public class UserService {

    private TokenRepo tokenRepo;
    private MailService mailService;
    private AppUserRepo appUserRepo;
    private PasswordEncoder passwordEncoder;

    @Autowired
    public UserService(AppUserRepo appUserRepo, PasswordEncoder passwordEncoder, TokenRepo tokenRepo, MailService mailService) {
        this.appUserRepo = appUserRepo;
        this.passwordEncoder = passwordEncoder;
        this.tokenRepo = tokenRepo;
        this.mailService = mailService;
    }

    public void addUser(AppUser appUser) {
        appUser.setPassword(passwordEncoder.encode(appUser.getPassword()));
        appUser.setRole("ROLE_USER");
        appUserRepo.save(appUser);
        sendToken(appUser);
    }

    private void sendToken(AppUser appUser) {
        String tokenValue = UUID.randomUUID().toString();
        Token token = new Token();
        token.setValue(tokenValue);
        token.setAppUser(appUser);
        tokenRepo.save(token);
        String url = "http://localhost:8080/token?value=" + tokenValue;

        try {
            mailService.sendMail(appUser.getEmail(), "Register", url, false);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public Optional <AppUser> findByEmail(String email) {
        return appUserRepo.findByEmail(email);
    }

    @Transactional
    public Optional <AppUser> findByUsername(String username) {
        return appUserRepo.findByEmail(username);
    }

    public boolean appUserEmailExists(String email){
        return findByEmail(email).isPresent();
    }

    public boolean appUserUsernameExists(String username){
        return findByUsername(username).isPresent();
    }
}

它告诉我需要在我的 AppUserRepo.java中更改Optional<AppUser>AppUser

用户控制器.java

@Controller
public class UserController {


    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }


    @GetMapping("/register")
    public String register(@ModelAttribute AppUser appUser, Model model) {
        model.addAttribute("appUser", new AppUser());
        return "register";
    }

    @PostMapping("/register")
    public String registerOk(@Valid @ModelAttribute("appUser") AppUser appUser, BindingResult bindingResult, Model model) {

//        if (userService.appUserUsernameExists(appUser.getUsername())) {
//            bindingResult.addError(new FieldError
//                    ("appUser", "username", "Login already exists"));
//        }

        if (userService.appUserEmailExists(appUser.getEmail())) {
            bindingResult.addError(new FieldError
                    ("appUser", "email", "Email already exists"));
        }

        if (bindingResult.hasErrors()) {
            return "register";
        } else {
            userService.addUser(appUser);
            return "redirect:register?success";
        }
    }
}

下面的类实现了我有问题的 UserDetailsS​​ervice。UserDetailsS​​erviceImpl.java

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    private AppUserRepo appUserRepo;

    @Autowired
    public UserDetailsServiceImpl(AppUserRepo appUserRepo) {
        this.appUserRepo = appUserRepo;
    }

    @Override
    public UserDetails loadUserByUsername(String user) throws UsernameNotFoundException {
        return appUserRepo.findByUsername(user);
    }
}

应用用户.java


@Data
@Entity
public class AppUser implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Size(min = 4, message = "Atleast 4 characters")
    private String username;

    @Size(min = 6, message = "Atleast 6 characters")
    private String password;

    private String role;

    @Column(name = "Email")
    @NotBlank
    @Email(message = "real e-mail adress required")
    private String email;

    @Pattern(regexp = "\\d{9}")
    private String phone;

    @NotBlank
    private String name;

    @NotBlank
    private String surname;

    private boolean isEnabled;

    public AppUser() {
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return Collections.singleton(new SimpleGrantedAuthority(role));
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return isEnabled;
    }

}

标签: javaspring-bootjpa

解决方案


利用

AppUser findByUsername(String username);

if (myrepo.findByUsername("...") != null)

推荐阅读