В 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в граале?