Граальс 3.3.8.Как обойти ошибку java.sql.Date свойство не соответствует типу - PullRequest
0 голосов
/ 25 февраля 2019

В grails существует серьезная ошибка, которая означает, что любая форма, использующая объекты scaffolding / fields plugin / command с привязкой данных, завершается ошибкой.

См .: https://github.com/grails/grails-core/issues/11126

В моем приложении есть много объектов домена с датами (без часового или часового пояса, таких как birthDate, issueDate, validUntilDate, memerableDate и т. Д.)

К сожалению, проблема закрыта без какого-либо исправления для Грааля. 3.3.8.Grails 4 находится далеко внизу в плане стабильности, чтобы переключиться на него (по крайней мере, на 6 месяцев).

Я потратил около 2 человеко-недель (серьезная сумма моих денег), пытаясь найти что-то вродеобходного пути.Эта проблема сейчас является критической.

В настоящее время я дошел до того, что я могу как отображать, так и создавать доменные объекты с java.time.LocalDate (я переключился на это, предпочитая java.sql.Date в качестве егоневозможно изменить поведение java.sql.Date, используя плагин fields, так как views / _fields / Date / _widget.gsp и т. д. ссылаются на java.util.date)

Но я не могу их редактировать.

Хак, который я использую для их создания, таков:

User.groovy:

   class User {
       String name 
       java.time.LocalTime birthDate
       // etc
   }

UserController.groovy

def save(User user) {
    user.clearErrors() // this fixed the spurious "property is type-mismatched"
   java.time.LocalDate birthDate = LocalDate.of(params.int('birthDate_year'), params.int("birthDate_month"), params.int("birthDate_day"))
   user.birthDate = birthDate
   userService.save(user)
   :
}

Это работает.

Проблема в том, что когда я хочу отредактировать объект, используя стандартную gaffolded / генерируемую gsp, вот так:

<g:form resource="${this.user}" method="PUT">
    <g:hiddenField name="version" value="${this.user?.version}" />
    <fieldset class="form">
        <f:all bean="user"/>
    </fieldset>
    <fieldset class="buttons">
        <input class="save" type="submit" value="${message(code: 'default.button.update.label', default: 'Update')}" />
    </fieldset>
</g:form>

Это дает:

Cannot cast object '2119-01-02' with class 'java.time.LocalDate' to class 'java.util.Date'

Я пыталсяпереопределить представления / _fields / LocalDate / _widget.gsp с ручным преобразованием из LocalDate в дату таким образом:

<g:datePicker name="${property}"  precision="day" value="${java.sql.Date.valueOf(value)}" default="none" noSelection="['':'']"/>

Но это дает:

cannot resolve which method to invoke for [null] due to overlapping prototypes between: [class java.lang.String] [class java.time.LocalDate]

Что я не могу найти способчтобы начать работать (перепробовал около 30 вариантов выше)

Может кто-нибудь придумать способ обойти эту проблему, чтобы мы могли позволить пользователю редактировать объекты с датами (без времени и часовых поясов) через плагин fieldsв граале?

1 Ответ

0 голосов
/ 22 августа 2019

У меня была та же ошибка, но с использованием Grails 2.5.5.Когда я добавляю поле Date в существующий класс, IDE добавляет import: import java.sql.Date

В этом состоянии у меня была ошибка несоответствия типов, но при удалении импорта все работает нормально.

...