gpt4 book ai didi

java - 使用 Spring 自定义唯一用户名验证

转载 作者:行者123 更新时间:2023-11-30 02:08:17 25 4
gpt4 key购买 nike

我想确保在创建新用户名或更新用户名时用户名是唯一的。我编写了下面的代码,它可以很好地创建和更新用户名。但是,当仅更新其他用户字段(例如年龄或性别)并维护相同的用户名时,它会返回无效,因为用户名已存在。

重要的是要说我想要的验证是使用 BindingResult。我已经有一个数据库,它将用户名视为唯一约束。但现在我想要使用 BindingResult 进行相同的验证。但我的做法在更新用户时会导致错误。

定义注解@UniqueUsername

package app.condominio.validator;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Constraint(validatedBy = UniqueUsernameValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueUsername {
String message() default "Nome de usuário já está sendo usado";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}

实现 validator

package app.condominio.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.springframework.beans.factory.annotation.Autowired;

import app.condominio.service.UsuarioService;

public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {

@Autowired
UsuarioService usuarioService;

@Override
public void initialize(UniqueUsername username) {
}

@Override
public boolean isValid(String username, ConstraintValidatorContext cxt) {
return !usuarioService.existe(username);
}
}

在Usuario.class中

@Entity
@Table(name = "Usuarios")
public class Usuario implements Serializable {

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

@NotBlank
@UniqueUsername
private String username;

@NotBlank
private String password;

@NotBlank
private String nome;

@Email
private String email;

...

Usuario服务

@Service
@Transactional
public class UsuarioServiceImpl implements UsuarioService {

@Autowired
private UsuarioDao usuarioDao;

@Override
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public boolean existe(String username) {
return usuarioDao.existsByUsername(username);
}

UsuarioDao

public interface UsuarioDao extends CrudRepository<Usuario, Long> {

Usuario findByUsername(String username);

Boolean existsByUsername(String username);

}

Controller

@Controller
@RequestMapping("conta")
public class UsuarioController {

@Autowired
private UsuarioService usuarioService;

@GetMapping("/cadastrar/sindico")
public ModelAndView preCadastro(@ModelAttribute("usuario") Usuario usuario, ModelMap model) {
model.addAttribute("conteudo", "cadastrarSindico");
return new ModelAndView("site/layout", model);
}

@PostMapping("/cadastrar/sindico")
public ModelAndView posCadastro(@Valid @ModelAttribute("usuario") Usuario usuario, BindingResult validacao, ModelMap model) {
if (validacao.hasErrors()) {
return preCadastro(usuario, model);
}
usuarioService.salvarSindico(usuario);
model.addAttribute(usuario);
model.addAttribute("conteudo", "cadastrarCondominio");
return new ModelAndView("site/layout", model);
}

最佳答案

我认为 UniqueUsernameValidator 操作符合预期。

我对您的应用程序不是很清楚。因此很难实现一种方法来检查验证用户是否与数据库中的用户具有相同的ID。也许您应该提供更多详细信息,例如方法的代码usuarioService.existe(用户名)

对我来说,为了确保用户名是唯一的,我这样做:

@Column(unique=true)
String username;

或使用@UniqueConstraint

@Table(name = "users", uniqueConstraints = {
@UniqueConstraint(columnNames = {
"username"
})
})

请注意,如果您让 JPA 创建表,它就会起作用。

关于java - 使用 Spring 自定义唯一用户名验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50867826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com