如何让我的模型类字段独一无二?例如。如果已经登录,我想为用户显示正确的消息。我必须编写自己的验证检查并使用它,或者可以使用JPA @UniqueConstraint
吗?
答案 0 :(得分:5)
我这样做了:
@Entity
public class User extends Model {
@Basic(optional=false) @Column(unique=true) public String name;
public User(String name) {
this.name = name;
create();
}
/** used in registration to find name clash */
public static User findByName(String name) {
return find("name", name).first();
}
}
然后在控制器中执行以下操作:
public static void register(@Required String name) {
if(User.findByName(name)!=null) {
Validation.addError("name", "this name is not available");
}
if (validation.hasErrors()) {
validation.keep();
params.flash();
flash.error("Please correct the form data.");
signup(); // whatever your GET action was
}
User user = new User(name);
login(); // whatever your success action is
}
你可以在没有User.findByName()检查的情况下做到这一点,你会得到一个ConstrainViolationException但当然不是非常用户友好。您也可以尝试/捕获该异常。我更喜欢两种方式,用户友好且在数据库中保持一致。
答案 1 :(得分:2)
你必须自己写支票。见http://bazaar.launchpad.net/~opensource21/+junk/permsec/files/head:/app/de/ppi/util/validation/ 几个月前我写了它,不幸的是我现在没时间玩游戏。
答案 2 :(得分:0)
我通过覆盖我的crud控制器中的create方法来实现这一点。在validaiton.hasErrors()方法之前调用自定义validateUniqueFields方法。然后,我可以为我的唯一字段返回有效错误。
public static void create() throws Exception
{
ObjectType type = ObjectType.get(getControllerClass());
notFoundIfNull(type);
Constructor<?> constructor = type.entityClass.getDeclaredConstructor();
constructor.setAccessible(true);
Model object = (Model) constructor.newInstance();
Binder.bindBean(params.getRootParamNode(), "object", object);
validation.valid(object);
validateUniqueFields(object);
if (validation.hasErrors()) {
renderArgs.put("error", play.i18n.Messages.get("crud.hasErrors"));
try {
render(request.controller.replace(".", "/") + "/blank.html", type, object);
} catch (TemplateNotFoundException e) {
render("CRUD/blank.html", type, object);
}
}
object._save();
flash.success(play.i18n.Messages.get("crud.created", type.modelName));
if (params.get("_save") != null) {
redirect(request.controller + ".list");
}
if (params.get("_saveAndAddAnother") != null) {
redirect(request.controller + ".blank");
}
redirect(request.controller + ".show", object._key());
}
private static void validateUniqueFields(Model object) {
String value = ((CastModelHere)object).identifier;
String ident = "identifier";
if( TUCharacterTypeIdentifier.find(ident, value).first() != null )
{
validation.addError("object." + ident, ident + " already taken");
}
}