我有Grails 3.1.2应用程序

我的 Realm 类(class)之一是目标

import java.time.LocalDateTime
import java.time.temporal.ChronoUnit

class Goal {
    String name
    String description
    LocalDateTime targetDate
    Date dateCreated
    Date lastUpdated
    static constraints = {
        name(nullable: false, blank: false)
    }
}

当我在目标实例上调用validate时,我得到:
  • 字段'targetDate'上的对象'com.liftyourgame.model.Goal'中的字段错误:拒绝的值[2016-01-28T15:10:3​​9.000Z];代码[com.liftyourgame.model.Goal.targetDate.typeMismatch.error,com.liftyourgame.model.Goal.targetDate.typeMismatch,go.targetDate.typeMismatch.error,goal.targetDate.typeMismatch,typeMismatch.com.liftyourgame.model。 Goal.targetDate,typeMismatch.targetDate,typeMismatch.java.time.LocalDateTime,typeMismatch];参数[targetDate];默认消息[找不到与以下对象匹配的构造函数:java.time.LocalDateTime(java.lang.String)]

  • 如何更改验证,使其不需要此构造函数?

    最佳答案



    您不能,但是验证并不是真正的问题。数据绑定(bind)器是问题所在。默认的资料夹尚未内置对LocalDateTime的支持。

    您可以这样注册自己的转换器:

    转换器:

    // src/main/groovy/demo/MyDateTimeConverter.groovy
    package demo
    
    import grails.databinding.converters.ValueConverter
    
    import java.time.LocalDateTime
    import java.time.format.DateTimeFormatter
    
    class MyDateTimeConverter implements ValueConverter {
        @Override
        boolean canConvert(Object value) {
            value instanceof String
        }
    
        @Override
        Object convert(Object value) {
            def fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
            LocalDateTime.parse(value, fmt)
        }
    
        @Override
        Class<?> getTargetType() {
            LocalDateTime
        }
    }
    

    将其注册为bean:
    // grails-app/conf/spring/resources.groovy
    beans = {
        myConverter demo.MyDateTimeConverter
    }
    

    07-26 03:11