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
をさくっと削除して、解決しました。
忘れないように、メモしておきます。