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

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

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