【问题标题】:Could not find matching constructor for: java.time.LocalDateTime(java.lang.String)找不到匹配的构造函数:java.time.LocalDateTime(java.lang.String)
【发布时间】:2016-06-17 14:16:43
【问题描述】:

我有一个 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)
    }
}

当我对我的 Goal 实例调用 validate 时,我得到:

  • 字段“targetDate”上的对象“com.liftyourgame.model.Goal”中的字段错误:拒绝值 [2016-01-28T15:10:39.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];参数 [targetDate];默认消息 [找不到匹配的构造函数:java.time.LocalDateTime(java.lang.String)]

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

【问题讨论】:

  • 嗨安德烈亚斯,这不是真正的重复。我正在使用来自 org.hibernate:hibernate-java8:5.1.0.Final 的映射 休眠模式验证在启动时传递,将 LocalDateTime 字段映射到 MySQL DateTime 字段类型
  • @Andreas 这里描述的问题与休眠或持久性无关。该问题与默认数据绑定器有关。

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


【解决方案1】:

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

您不能,但验证并不是真正的问题。数据绑定器是问题所在。默认的 binder 还没有内置对 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
}

【讨论】:

  • 当然,您不必像该示例那样对格式进行硬编码。我保持简单以展示该机制是如何工作的。如果您只需要 1 种格式,那么我在那里展示的内容就可以了。
  • 我认为这种情况下的格式化程序是线程安全的,不像SimpleDateFormat。因此,您不必在每次调用 convert 时都创建一个新的。您可以将其初始化为类中的属性并重新使用它。
猜你喜欢
  • 2022-01-09
  • 2016-01-26
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多