この質問は Grails 2.1.1 に関するものです。コントローラーに設定された 3 つの日付フィールドを含むドメイン オブジェクトがあります。コントローラーに設定されている日付が無視され、現在の日付に置き換えられるというバグがありました
奇妙なことに、この動作は、ドメイン オブジェクト内の対応するフィールドの名前を「日付」サフィックスを持つように変更したときにのみ解決されました。
私が知りたいのですが:
- 従わなければならない特定の命名規則がある場合、
- または、私が理解していない別の根底にある問題があるかどうか(率直に言って、私があまり快適ではないボンネットの下で発生するかなりの量の聖杯の「魔法」があることは知っています)
分析とコード サンプルを以下に示します。
元のドメイン オブジェクトとコントローラー - この場合、「dateCreated」と「lastUpdated」に設定された値は無視され、システムの日付によって上書きされます。
class User {
String name
String title
String firstName
String lastName
Date companyCreationDate
Date dateCreated //works when renamed to createdDate (and controller updated accordingly)
Date lastUpdated //works when renamed to lastUpdatedDate (and controller updated accordingly)
static mapping = {
id column:'record_id'
}
static constraints = {
id()
title(blank: false, maxSize: 35)
firstName(blank: false, minSize: 1, maxSize: 35)
lastName(blank: false, minSize: 1, maxSize: 35)
}
}
クラス ユーザーコントローラー {
static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
static df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)
def save() {
def user = new User()
user.name = params.name
user.companyCreationDate = df.parse("2006-09-07 13:26:15");
user.title = params._title
user.firstName = params._fname
user.lastName = params._lName
user.creationDate = df.parse("2006-09-07 00:00:00");
user.lastUpdatedDate = df.parse("2006-09-07 00:00:00");
if (user.validate()){
user.clearErrors();
if (user.save(flush: true)) {
flash.message = message(code: 'default.created.message', args: [message(code: 'registration.label', default: 'Registration'), user.id])
redirect(action: "show", id: user.id)
}
}
else
{
render(view: "create", model: [userInstance: user])
}
Hibernate でトレース オプションを設定した後、ドメイン オブジェクトの保存 (つまり、'save(flush: true)' の呼び出し) と Hibernate による永続化アクションの実行の間で、この変換が行われていることに気付きました。