假设我有一个可以提交username(@NaturalId)
给password
新用户的表单。
我想添加具有唯一性的用户username
。如何使用@Valid
注释来验证此约束?如果用户名不是唯一的,我如何在 jsp 中显示此信息<form:error/>
?
假设我有一个可以提交username(@NaturalId)
给password
新用户的表单。
我想添加具有唯一性的用户username
。如何使用@Valid
注释来验证此约束?如果用户名不是唯一的,我如何在 jsp 中显示此信息<form:error/>
?
AFAIK 没有注释可以做到这一点。你有两个选择
一、创建自定义验证器注解。这是一个很好的例子。调用您的 DAO 类并检查验证器实现中的可用性
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
return userDAO.userNameAvailable(object); //some method to check username availability
}
或者
在实体类中的属性上设置 unique = true 。
@Column(unique = true)
private String userName;
但这不适用于@valid,而是在持久性上抛出异常。您必须使用适当的逻辑来处理它。
第一个解决方案不是万无一失的。在 SO 上检查这个答案。
第二个永远不会失败。
更新
正如 NimChimpsky 评论的那样,将两者结合使用将是一个具体的解决方案。
JSR-303 不支持您想要的(类似于@Unique
约束)。您必须编写自己的验证器。这里解释了如何做到这一点:https ://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator
但在此之前,请确保您阅读此答案:https ://stackoverflow.com/a/3499111/1981720
还有上一篇文章中的这句话:
@Unique 不是内置约束的一部分的原因是,在验证期间访问 Session/EntityManager 正在为潜在的幻像读取敞开大门。
您可以使用 UserDetailsService 准备的 spring 类并对其进行扩展和自定义:
@Service
public class LoginDetailsServiceImpl implements UserDetailsService, Serializable {
@Autowired
LoginService loginService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (username == "" || username.isEmpty()) {
throw new UsernameNotFoundException(String.format("User %s is invalid!", username));
}
Login login = loginService.find(username);
if (login == null) {
throw new UsernameNotFoundException(String.format("User %s does not exist!", username));
}
if (!loginService.scheduleChecking(login.getScheduled())) {
throw new UsernameNotFoundException(String.format("User %s is not authorized this time!", username));
}
//....
我认为有一种方法可以找到唯一用户名。您必须使用本机查询来执行特定任务。
您必须在存储库界面上执行此查询
@Query(value = "SELECT * FROM customers_details WHERE username = :username , nativeQuery = true)
public List findEmaiList(@Param("username") String username , @Param("id") Long id);
您可以从查询中获取类似的数据并通过任何您想要的验证。为方便起见,您还可以创建单独的唯一 API。您还可以使用此查询找到不同的唯一参数,例如电子邮件或移动设备