标签: grails-validation

Grails域类:多列的唯一约束

假设一个简单的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

46
推荐指数
1
解决办法
2万
查看次数

显示Grails字段错误

有谁知道如何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)

但我想将默认消息转换为我的新错误消息并打印出来.

error-handling grails grails-validation

15
推荐指数
1
解决办法
7290
查看次数

Grails自定义错误消息的问题

我目前正在尝试在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 =自定义消息

我还尝试完全删除默认错误消息,但仍然显示它们

如果有人以前遇到过这个问题,我将不胜感激,任何人都可以给予我任何帮助

提前致谢

grails groovy grails-plugin grails-validation

13
推荐指数
2
解决办法
1万
查看次数

如何覆盖Grails中的默认错误消息?

我有一个带有lastName字段的Person对象.lastName字段不能为空.当用户在lastName字段中提交表单空白值时,用户看到的错误消息是:

Property [lastName] of class [com.example.Person] cannot be blank
Run Code Online (Sandbox Code Playgroud)

此错误消息是蹩脚的.我想将它自定义为更加用户友好的内容,例如"姓氏字段不能为空"

我怎么做?

grails grails-validation

13
推荐指数
1
解决办法
7500
查看次数

Grails:嵌套的命令对象

在我的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 grails-validation command-objects

9
推荐指数
2
解决办法
4444
查看次数

Grails min约束日期验证

我是grails和groovy的新手.我有一个具有开始和结束日期的Project域类.我想提出一个约束,指定结束日期需要大于开始日期(然后项目的另一个子对象需要让其startdate和enddate与父项目的日期一起验证).这可能是最小约束还是我必须把它放在其他地方?唯一约束允许以这种方式链接两个属性,希望min/max约束允许这样做.我试过了

startDate(blank:false)
endDate(blank:false, min:'startDate')
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误,指出属性startDate在Project上不可用

grails grails-validation grails-domain-class

9
推荐指数
1
解决办法
5724
查看次数

validate()和hasErrors()之间的联系是什么

这个问题来自我的另一个问题.在那个问题中,我遇到一种情况,即hasErrors()函数不适用于非持久域类,即使在我按照指令执行的所有操作之后,第7.5部分也是如此.

按照Victor的方式,我通过调用validate()修复了问题,但我不明白它为什么会起作用.Grails文档似乎没有说明你应该在hasErrors()函数之前调用validate().怎么会发生这种情况?

grails grails-validation

8
推荐指数
1
解决办法
5997
查看次数

Grails客户端验证

你如何(如果你)用grails管理客户端验证?您是使用插件还是使用javascript框架镜像约束?干杯

grails grails-plugin grails-validation

7
推荐指数
1
解决办法
2271
查看次数

自定义Grails验证

通常对于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它不是父类的方法(它是由元编程添加的).还有另一种方法来实现我的目标吗?

grails groovy grails-validation

7
推荐指数
1
解决办法
1481
查看次数

Grails:我可以将验证器应用于仅创建(不更新/编辑)

我有一个域类,需要在其一个字段中创建日期之后有一个日期.

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)

mysql grails calendar grails-validation

7
推荐指数
1
解决办法
1298
查看次数