2016-03-04 6 views
0

У меня есть Grails 3.1.2 приложениеНе удалось найти соответствующий конструктор: java.time.LocalDateTime (java.lang.String)

Один из моих классов предметной области является цель

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» на поле «targetDate»: отвергнуто значения [2016-01-28T15: 10: 39.000Z] ; коды [com.lastyourgame.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)]

Как я могу изменить валидацию, чтобы он не нуждался в этом конструкторе?

+0

Возможный дубликат http://stackoverflow.com/questions/35507996/grails-mapping-localdatetime-of-java-8-domain-objects-to-gorm – Andreas

+1

Привет, Андреас. На самом деле это не дубликат. Я использую привязки из org.hibernate: гибернации-java8: 5.1.0.Final Проверка зимуют схему проходит при запуске отображения полого LocalDateTime типов MySQL DateTime поля –

+0

@Andreas Проблема, описанная здесь, на самом деле не относятся к гибернату или постоянству. Проблема связана с привязкой данных по умолчанию. –

ответ

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

Зарегистрируйте как боб:

// grails-app/conf/spring/resources.groovy 
beans = { 
    myConverter demo.MyDateTimeConverter 
} 
+0

Конечно, вам не нужно жестко кодировать формат, подобный этому примеру. Я так просто прояснил, как работает механизм. Если вам нужен только один формат, то, что я показываю, будет работать нормально. –

+0

Я думаю, что форматирование в этом случае является потокобезопасным, в отличие от «SimpleDateFormat». Из-за этого вам не нужно создавать новый каждый раз при вызове 'convert'. Вы можете инициализировать его один раз как свойство в классе и повторно использовать его. –

Смежные вопросы