假设一个简单的Grails域类:
class Account {
String countryId;
String userName;
String password;
static constraints = {
...???...
}
}
Run Code Online (Sandbox Code Playgroud)
要求用户名对于特定countryId是唯一的,因此在两列上必须存在唯一约束.如何在约束定义中表达这一点?
orm grails unique-constraint grails-validation grails-domain-class
有谁知道如何fieldError在下面的例子中打印出来.
对于每个有错误的项目,我想打印我在messages.properties文件中定义的自定义错误消息
所有这一切都是打印默认错误代码
item.errors?.allErrors?.each{
println it.toString()
}
Run Code Online (Sandbox Code Playgroud)
我已经看到了其他示例,您可以在其中查找字段的错误代码,例如
it.getFieldError('title').code
Run Code Online (Sandbox Code Playgroud)
但我想将默认消息转换为我的新错误消息并打印出来.
我目前正在尝试在grails中为默认约束指定自定义错误消息,但到目前为止我所有回来的都是默认错误消息.
我知道我必须编辑grails-app/i18n/messages.properties文件
如果我更改以下默认错误代码消息,它将正确显示新的错误消息
default.blank.message=Property [{0}] of class [{1}] cannot be blank
Run Code Online (Sandbox Code Playgroud)
但是,这不是我想要做的.我需要更细粒度的错误报告,并且有多个字段可以为空白等.我希望能够做的是,为类中的每个字段显示自定义消息
package com.mycompany.myapp
class Test{
String name
def constraints = {
name(nullable:false, blank:false)
}
}
Run Code Online (Sandbox Code Playgroud)
(以下代码附加到messages.properties的末尾)
test.name.blank=Name cannot be blank
test.name.nullable=Name cannot be nullable
Run Code Online (Sandbox Code Playgroud)
根据grails文档,这应该可以正常工作,无论是否包名 - className.propertyName.blank
grails.org/doc/latest/(约束部分)&(第7.4节 - 验证和国际化)
我已经尝试了所有可以想到的组合,但它总是显示自定义消息
我也尝试过安装grails i18n模板插件
http://www.grails.org/I18n+Templates+Plugin
它会自动为我生成错误代码.我将新的错误代码附加到现有messages.properties文件的末尾,但我仍然收到默认的错误消息.
但是,插件生成的错误代码有所不同.
而不是grails doc - test.name.null = ......中指定的格式,它自动生成test.name.null.error =自定义消息
我还尝试完全删除默认错误消息,但仍然显示它们
如果有人以前遇到过这个问题,我将不胜感激,任何人都可以给予我任何帮助
提前致谢
我有一个带有lastName字段的Person对象.lastName字段不能为空.当用户在lastName字段中提交表单空白值时,用户看到的错误消息是:
Property [lastName] of class [com.example.Person] cannot be blank
Run Code Online (Sandbox Code Playgroud)
此错误消息是蹩脚的.我想将它自定义为更加用户友好的内容,例如"姓氏字段不能为空"
我怎么做?
在我的grails应用程序中,我有一个外部命令对象,其中包含其他命令对象的列表:
public class OuterCommand {
List<InnerCommand> innerCommands = ListUtils.lazyList([], FactoryUtils.instantiateFactory(InnerCommand))
}
class InnerCommand {
String code
Long id
String value
static constraints = {
code(nullable: false, blank: false)
value(nullable: false, blank: false)
}
}
Run Code Online (Sandbox Code Playgroud)
相当不寻常的实例化innerCommands是基于这个建议.但是,我发现如果我调用validate()一个实例OuterCommand,验证似乎不会验证包含的实例InnerCommand.
是否可以嵌套命令对象并validate()在最外层对象上调用时验证命令对象的整个图形?
谢谢,唐
我是grails和groovy的新手.我有一个具有开始和结束日期的Project域类.我想提出一个约束,指定结束日期需要大于开始日期(然后项目的另一个子对象需要让其startdate和enddate与父项目的日期一起验证).这可能是最小约束还是我必须把它放在其他地方?唯一约束允许以这种方式链接两个属性,希望min/max约束允许这样做.我试过了
startDate(blank:false)
endDate(blank:false, min:'startDate')
Run Code Online (Sandbox Code Playgroud)
它会抛出一个错误,指出属性startDate在Project上不可用
你如何(如果你)用grails管理客户端验证?您是使用插件还是使用javascript框架镜像约束?干杯
通常对于Grails域或命令类,您声明约束,并且框架添加一个validate()方法来检查这些约束中的每一个是否对当前实例有效,例如
class Adult {
String name
Integer age
void preValidate() {
// Implementation omitted
}
static constraints = {
name(blank: false)
age(min: 18)
}
}
def p = new Person(name: 'bob', age: 21)
p.validate()
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我想确保preValidate在验证类之前始终执行.我可以通过添加方法来实现这一点
def customValidate() {
preValidate()
validate()
}
Run Code Online (Sandbox Code Playgroud)
但是那些使用这个课程的人都需要记得打电话customValidate而不是validate.我也不能这样做
def validate() {
preValidate()
super.validate()
}
Run Code Online (Sandbox Code Playgroud)
因为validate它不是父类的方法(它是由元编程添加的).还有另一种方法来实现我的目标吗?
我有一个域类,需要在其一个字段中创建日期之后有一个日期.
class myClass {
Date startDate
String iAmGonnaChangeThisInSeveralDays
static constraints = {
iAmGonnaChangeThisInSeveralDays(nullable:true)
startDate(validator:{
def now = new Date()
def roundedDay = DateUtils.round(now, Calendar.DATE)
def checkAgainst
if(roundedDay>now){
Calendar cal = Calendar.getInstance();
cal.setTime(roundedDay);
cal.add(Calendar.DAY_OF_YEAR, -1); // <--
checkAgainst = cal.getTime();
}
else checkAgainst = roundedDay
return (it >= checkAgainst)
})
}
}
Run Code Online (Sandbox Code Playgroud)
所以几天后,当我只更改字符串并调用save时,保存失败,因为验证器正在重新检查日期,现在它已经过去了.我是否可以将验证器设置为仅在创建时触发,或者是否可以通过某种方式更改它以检测我们是否正在创建或编辑/更新?
@Rob H我不完全确定如何使用你的答案.我有以下代码导致此错误:
myInstance.iAmGonnaChangeThisInSeveralDays = "nachos"
myInstance.save()
if(myInstance.hasErrors()){
println "This keeps happening because of the stupid date problem"
}
Run Code Online (Sandbox Code Playgroud)