ホーム > Google App Engine, slim3 > slim3 で ModelクラスのStringに(@lob=true)を追加すると org.slim3.controller.HotReloadingRuntimeException が発生

slim3 で ModelクラスのStringに(@lob=true)を追加すると org.slim3.controller.HotReloadingRuntimeException が発生

2010 年 6 月 22 日 tdtsh
このエントリーをはてなブックマークに追加
はてなブックマーク - slim3 で ModelクラスのStringに(@lob=true)を追加すると org.slim3.controller.HotReloadingRuntimeException が発生
Share on Facebook
Share on FriendFeed
Share on GREE
Share on reddit
Share on LinkedIn

slim3 で、既に存在するModelクラスのStringフィールドに、文字列を沢山保存しようとすると
IllegalArgumentException が発生して保存が出来ませんでした。

これはApp Engineの仕様で、通常Entity オブジェクトにプロパティとして格納される Java 文字列は 500 文字まで、となっています。長いテキスト文字列(500バイトより大)は Text 値として保存することができます。

これを私が忘れていただけでして、当然Slim3でもjava.lang.Stringでは500文字以下じゃないといけません。

で、ここからが本題なんですが、Slim3 Datastore では、長いテキスト文字列を Text 値として保存する場合、Stringフィールドを定義するときに @Attribute(lob = true) アノテーションをつけておけば、内部的にText型に適宜変換してくれる様です。

つまり、

	private Text bodyOfPage;

こう書くこともできるし、

	@Attribute(lob = true)
	private String bodyOfPage;

こう書くこともできる。

後者の方が、バリデーションチェックのコードとかを直さないで良いので楽だな、と思ったものですから、当然、「@Attribute(lob = true)」を追記しました。

すると、org.slim3.controller.HotReloadingRuntimeException が発生して、アプリケーションが動かなくなってしまい、暫くオタオタしました。

これも冷静に考えれば判る話でして、既に存在するModelクラスで定義されたデータが、データストレージに存在する訳ですから、型の不整合が起こる訳です。

今回はローカルでの話でしたので、データストレージ

war/WEB-INF/appengine-generated/local_db.bin
war/WEB-INF/appengine-generated/datastore-indexes-auto.xml

をさくっと削除して、解決しました。

忘れないように、メモしておきます。

カテゴリー: Google App Engine, slim3 タグ:
コメントは受け付けていません。