验证:保存前检查唯一性

Mic*_*tra 6 playframework

我正在使用Play Framework开发一个Web应用程序.我的应用程序有一个User类,后者又有一个用户名和一个电子邮件属性.很标准的东西.然而...

当新用户通过表单(注册,html)注册时,我想检查用户名和密码是否唯一,如果没有,则将它们重定向回表单并在那里显示消息.

我已经想到了一些解决方案,其中没有一个特别优雅,在我看来,必须有一种简单的方法来检查用户名/电子邮件在数据库中是否唯一,而不对表本身施加约束(这会导致运行时错误)当插入重复值时).

那么......有人遇到同样的问题吗?你是怎么解决的?

Bra*_*ace 2

我在调度系统中做了类似的事情,以防止同一个人的重叠轮班。在模型中,它使用一种@PrePersist方法来查询数据库,并在发现任何冲突时抛出自定义异常。

然后在控制器中我捕获异常(保存对象时将抛出该异常)并重定向回表单。

在模型中:

@PrePersist
public void prepareToInsert() {
    List<AgentShift> conflicts = find("agent=?1 and (start_time between ?2 and ?3 or end_time between ?2 and ?3)",
        agent,
        sql_datetime_formatter.print(scheduled.getStart()),
        sql_datetime_formatter.print(scheduled.getEnd())).fetch();
    if (!conflicts.isEmpty()) {
        throw new SchedulingException("New shift for " + agent +
            " overlaps existing shift which goes from " +
            sql_datetime_formatter.print(conflicts.get(0).scheduled.getStart()) + " to " +
            sql_datetime_formatter.print(conflicts.get(0).scheduled.getEnd()), conflicts);
    }

}
Run Code Online (Sandbox Code Playgroud)

在控制器中:

public static void create(@Valid AgentShift object) {
    ...
    try {
        object._save();
        ...
    }
    catch (SchedulingException e) {
        flash.error("conflict with existing shift", e.getConflicts());
        redirect(request.controller + ".blank", object._key());
    }
}
Run Code Online (Sandbox Code Playgroud)