【问题标题】:Custom error message not working in gorm with grails自定义错误消息在 grails 中不起作用
【发布时间】:2014-10-25 01:02:13
【问题描述】:

似乎无法在 Grails 2.3.7 上获得自定义验证消息。

class Team {
   int id
   String email

   static mapping = {
     id     column:'TEAM_ID', generator:'native'
     email  column:'TEAM_EMAIL' 
   }
   static constraints = { 
     email  unique:true
   }

messages.properties(尝试了所有这些...)

team.email.unique=Email already used!
Team.email.unique=Email already used!
my.package.Team.email.unique=Email already used!

我的服务发现了验证问题,但从未使用过自定义错误消息:

Team t = new Team(...)
if(!t.validate())
   println t.errors

输出...

Field error in object 'Team' on field 'email': rejected value.... ...
default message [Property [{0}] of class [{1}] with value [{2}] must be unique]

不确定是什么问题,根据docs 的约定是:

[Class Name].[Property Name].[Constraint Code]

额外配置

构建配置

dependencies {
    compile('com.oracle:ojdbc6:11.2.0')
}
plugins {
    build ":tomcat:7.0.52.1"
    runtime ":hibernate:3.6.10.9"
}

数据源

 dialect  =  "org.hibernate.dialect.Oracle10gDialect"
 hibernate {
    cache.use_second_level_cache = false
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
    singleSession = false 
}

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    根据http://grails.org/doc/2.3.7/ref/Constraints/unique.html 上的唯一约束文档页面,它是className.propertyName.unique,但println t.errors 总是看起来像您所看到的 - toString() 结果不是很有用。要查看已解决/已翻译的消息,您可以测试您在测试或测试应用程序中所做的事情,您可以使用它来显示已解决的消息:

    // dependency injection in controller/service/etc.
    def messageSource
    
    ...
    
    Locale locale = Locale.getDefault()
    def stringsByField = [:].withDefault { [] }
    
    for (fieldErrors in t.errors) {
       for (error in fieldErrors.allErrors) {
          String message = messageSource.getMessage(error, locale)
          stringsByField[error.field] << message
       }
    }
    
    println stringsByField
    

    【讨论】:

    • 什么是messageSource?那是预定义的 bean 吗?
    • 是的,因此您需要将其作为类范围变量依赖注入到工件(控制器、服务等)中
    • 它有效,为MapWithDefault +1,但messageSource.getMessage(error, locale) 需要 2-3 秒才能响应,即使针对相同的错误条件重复调用也是如此。我正在使用一个资源最少的简单测试应用程序,只有一个域类和服务;我已经用其他数据更新了我的问题;关于为什么那个电话需要这么长时间有什么想法吗?
    • 不知道,应该很快。这与 Grails 用于在 GSP 中显示消息的 bean 相同 - 您是否看到类似的慢手动检测或触发更改)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2012-07-14
    • 2019-12-16
    • 2011-11-27
    • 1970-01-01
    • 2021-02-02
    • 2021-03-11
    相关资源
    最近更新 更多