java—如何验证用户是否存在,但springboot中没有可选的

bybem2ql  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(428)

我有一个springboot应用程序,用户可以注册使用电子邮件和用户名。我可以用可选的ispresent()方法验证数据库中是否已经存在电子邮件,但是我不能用username做同样的事情,因为userdetailsserviceimpl.java中的userdetailsservice正在我需要的项目中使用。
当我进来的时候 AppUserRepo.java ```
AppUser findByUsername(String username);
Optional findByEmail(String email);

而不是

Optional findByUsername(String username);

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

Optional findByUsername(String username);

我犯了错误,它说我必须改变 `Optional<AppUser>` 至 `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();
}

}

它告诉我需要从 `Optional<AppUser>` 至 `AppUser` 在我的appuserrepo.java中
用户控制器.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";
    }
}

}

下面的类实现了我遇到问题的userdetailsservice。userdetailsserviceimpl.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;
}

}

s5a0g9ez

s5a0g9ez1#

使用

AppUser findByUsername(String username);

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

相关问题