17

假设我有一个可以提交username(@NaturalId)password新用户的表单。

我想添加具有唯一性的用户username。如何使用@Valid注释来验证此约束?如果用户名不是唯一的,我如何在 jsp 中显示此信息<form:error/>

4

4 回答 4

27

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 评论的那样,将两者结合使用将是一个具体的解决方案。

于 2013-06-14T09:13:52.353 回答
3

JSR-303 不支持您想要的(类似于@Unique约束)。您必须编写自己的验证器。这里解释了如何做到这一点:https ://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator

但在此之前,请确保您阅读此答案:https ://stackoverflow.com/a/3499111/1981720

还有上一篇文章中的这句话:

@Unique 不是内置约束的一部分的原因是,在验证期间访问 Session/EntityManager 正在为潜在的幻像读取敞开大门。

于 2013-06-14T09:10:29.017 回答
0

您可以使用 UserDetailsS​​ervice 准备的 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));
        }
      //....
于 2016-12-03T06:40:14.283 回答
0

我认为有一种方法可以找到唯一用户名。您必须使用本机查询来执行特定任务。

您必须在存储库界面上执行此查询

@Query(value = "SELECT * FROM customers_details WHERE username = :username , nativeQuery = true)
public List findEmaiList(@Param("username") String username , @Param("id") Long id);

您可以从查询中获取类似的数据并通过任何您想要的验证。为方便起见,您还可以创建单独的唯一 API。您还可以使用此查询找到不同的唯一参数,例如电子邮件或移动设备

于 2022-03-04T14:00:56.133 回答