Slim3でのHot deploy時 ClassCastException

Google App Engine for Java & Slim3 /Google SDK : 1.4.2
開発サーバで以下のエラーが発生した。なにやら、Hotデプロイ時にエラーになっているらしい。


HTTP ERROR 500

Problem accessing /testdata. Reason:

If you use MemcacheService or JCache, use org.slim3.memcache.Memcache instead of it.
Or if a COOL class wants to access a HOT reloaded class, use CoolBridge.
COOL classes means classes located on "com.appspot.categoryeditor.cool" package or classes which Servlet Container manages like Servlets.
HOT reloaded classes means classes located on "com.appspot.categoryeditor" package except "com.appspot.categoryeditor.cool" package.
See http://sites.google.com/site/slim3appengine/hot-reloading

Caused by:

org.slim3.controller.HotReloadingRuntimeException: If you use MemcacheService or JCache, use org.slim3.memcache.Memcache instead of it.
Or if a COOL class wants to access a HOT reloaded class, use CoolBridge.
COOL classes means classes located on "com.appspot.categoryeditor.cool" package or classes which Servlet Container manages like Servlets.
HOT reloaded classes means classes located on "com.appspot.categoryeditor" package except "com.appspot.categoryeditor.cool" package.
See http://sites.google.com/site/slim3appengine/hot-reloading
at org.slim3.controller.HotReloadingFilter.createHotReloadingRuntimeException(HotReloadingFilter.java:250)
at org.slim3.controller.HotReloadingFilter.doHotReloading(HotReloadingFilter.java:231)
at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:187)
at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
※省略


Caused by: java.lang.ClassCastException: com.appspot.categoryeditor.model.User cannot be cast to com.appspot.categoryeditor.model.User
at com.appspot.categoryeditor.meta.UserMeta.getKey(UserMeta.java:50)
at org.slim3.datastore.DatastoreUtil.modelToEntity(DatastoreUtil.java:948)
at org.slim3.datastore.AsyncDatastoreDelegate.putAsync(AsyncDatastoreDelegate.java:1671)
at org.slim3.datastore.DatastoreDelegate.put(DatastoreDelegate.java:2174)
at org.slim3.datastore.DatastoreDelegate.put(DatastoreDelegate.java:2123)

メッセージ中に、

See http://sites.google.com/site/slim3appengine/hot-reloading

とあったので、その通りにページを確認してみた。

このページ中に以下の記述があった。

Classes that are under except cool package are HOT reloadable.

A HOT reloadable class can reference a HOT reloadable class and a COOL class. A COOL class can reference A COOL class, but cannot reference a HOT reloadable one.

ルートパッケージ配下(coolパッケージを除いた)のクラスはHOT reloadableクラスとなり、それ以外はCOOLクラスとなるらしい。また、COOLクラスからHOT reloadableクラスは参照できないらしい。今回はこの条件にひっかかってしまったと思われる。
ということでプログラムを確認してみると、見事に異なるパッケージ(testパッケージ)配下のクラスからHOT reloadableなクラスを呼びだしていた。
今回、テスト的にControllerクラスを作成する際、前に作ったテストクラスを利用したのだが、そもそもそれが問題だったらしい。処理をルートパッケージ配下のクラスに記述して呼び出したら問題なく動作した。

エラーがドンと出て少しビビったけれど、よく確認してみるとそんなに大した問題じゃなかった。。