我们假设我有一个表单,我可以为新用户提交username(@NaturalId)
和password
。
我想为用户添加唯一的username
。如何使用@Valid
注释来验证此约束?如果用户名不是唯一的,我如何通过<form:error/>
在jsp中显示此信息?
答案 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)
您可以使用UserDetailsService准备好的spring类并对其进行扩展和自定义:
<securityTokenHandlerConfiguration>