如何@Validate在春天的唯一用户名?

时间:2013-06-13 16:43:40

标签: spring hibernate validation spring-mvc

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

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

3 个答案:

答案 0 :(得分:20)

AFAIK没有注释来执行此操作。你有两个选择

一,创建自定义验证器注释。 Here是一个非常好的例子。调用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上查看this回答。

第二个将永远不会失败。

<强>更新

正如NimChimpsky评论的那样,将两者结合使用将是一个具体的解决方案。

答案 1 :(得分:2)

JSR-303不支持您想要的内容(类似于@Unique约束)。你必须写自己的验证器。如何解决这个问题:https://community.jboss.org/wiki/AccessingtheHibernateSessionwithinaConstraintValidator

但在此之前请务必阅读以下答案:https://stackoverflow.com/a/3499111/1981720

这句话来自上一篇文章:

  

@Unique不是内置约束的一部分是事实   在vallation期间访问Session / EntityManager正在打开   自己动起幻想读物。

答案 2 :(得分:0)

您可以使用UserDetailsS​​ervice准备好的spring类并对其进行扩展和自定义:

<securityTokenHandlerConfiguration>