找不到匹配的构造函数:java.time.LocalDateTime(java.lang.String)

时间:2016-03-04 00:46:02

标签: java grails gorm grails-domain-class java-time

我有一个Grails 3.1.2应用程序

我的一个域类是目标

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)
    }
}

当我在我的目标实例上调用验证时,我得到:

  • 对象' com.liftyourgame.model.Goal'中的字段错误on field' targetDate&#39 ;:被拒绝的值[2016-01-28T15:10:3​​9.000Z];代码[com.liftyourgame.model.Goal.targetDate.typeMismatch.error,com.liftyourgame.model.Goal.targetDate.typeMismatch,goal.targetDate.typeMismatch.error,goal.targetDate.typeMismatch,typeMismatch.com.liftyourgame.model。 Goal.targetDate,typeMismatch.targetDate,typeMismatch.java.time.LocalDateTime,typeMismatch]; arguments [targetDate];默认消息[找不到匹配的构造函数:java.time.LocalDateTime(java.lang.String)]

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

1 个答案:

答案 0 :(得分:2)

  

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

你不能,但验证不是真正的问题。数据绑定器是问题所在。默认活页夹尚未内置对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
}