エラー:ClassCastException:…String cannot be cast to …Date

2,098 views
Skip to first unread message

としゆき

unread,
Jan 18, 2011, 3:02:59 AM1/18/11
to Google-App-Engine-Japan
こんにちは。
eclipse3.6での開発になります。
コード記述中には、赤い下線でエラーの指摘は出ないんですが、実行すると出てしまうようです。
まずはエラーの一部を。


java.lang.ClassCastException: java.lang.String cannot be cast to
java.util.Date
at com.soichi.rainbows.GCalendar.jdoReplaceField(GCalendar.java)
at com.soichi.rainbows.GCalendar.jdoReplaceFields(GCalendar.java)
at
org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:
2772)
at
org.datanucleus.state.JDOStateManagerImpl.replaceFields(JDOStateManagerImpl.java:
2791)
at
org.datanucleus.store.appengine.DatastorePersistenceHandler.fetchObject(DatastorePersistenceHandler.java:
480)
at
org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo(DatastoreQuery.java:
565)
at
org.datanucleus.store.appengine.query.DatastoreQuery.entityToPojo(DatastoreQuery.java:
520)
at org.datanucleus.store.appengine.query.DatastoreQuery.access
$300(DatastoreQuery.java:110)

情報不足な場合は指摘してください。

アプリケーションは二つのサーブレットを使用します。GetGCalendarServletでGoogleカレンダーのXML情報をパースし、それを
データストア(Bigtable)にPersistenceManagerクラスを使用し保存。ShowGCalendarServletで保存された
ものをデータストアからとりだし、HTMLを生成するというものです。

問題はこのShowGCalendarServletで、データを取り出すところで生じるようです。date変数はPersistentなDateオブ
ジェクト変数です。
後述するコードの「★★★←ここ!!!」の部分でエラーが生じるようです。自分はクエリを深く理解していませんが、どうやら作動しているようです。デ
バッカーはクエリを通過するので。しかし、クエリを実行あとの「calendars」のクラスを調べると、

org.datanucleus.store.appengine.query.StreamingQueryResult

というものらしいですが、これを「castできない」とエラーは言っているんでしょうか?

コードはこの下です(情報不足な場合は指摘してください)。

としゆき
//--------------------------------------

@SuppressWarnings("serial")
public class ShowCalendarServlet extends HttpServlet{
private static final String head =
"<html>\n"
+ "<body>\n"
+ " <span style=\"font-size: 200%\">RainbowCalendar</span>\n"
+ "<div id=\"list\">\n"
+ "</div>";

private static final String memoTmpl =
" <div>\n"
+ " <span class=\"date\"> {0, date} </span> \n"
+ " <pre>{1}</pre> \n"
+ " <pre>{2}</pre> \n"
+ " <pre>{3}</pre> \n"
+ " </div> \n";
private static final String tail =
" </body> \n" + "</html>\n";

static {
TimeZone.setDefault(TimeZone.getTimeZone("JST"));
}
private String render(List<GCalendar> calendars) {
StringBuffer sb = new StringBuffer();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
sb.append(head);
for (GCalendar calendar : calendars){
String tmp = sdf.format(calendar.getDate());
sb.append(MessageFormat.format(memoTmpl, tmp,
calendar.getYoubi(), calendar.getTime(),
calendar.getNaiyou()));
}
sb.append(tail);
return sb.toString();
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
PersistenceManager pm = null;
try {
pm = PMF.get().getPersistenceManager();
if (pm == null){
resp.sendRedirect("/getCalendar");
}

Query query = pm.newQuery(GCalendar.class);
query.setOrdering("date desc");

List<GCalendar> calendars = (List<GCalendar>)
query.execute();
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print(render(calendars)); //★★★←ここ!!!
query.closeAll();
} finally {
if (pm != null && !pm.isClosed())
pm.close();
}
}
}

Daisuke Yamashita

unread,
Jan 18, 2011, 11:51:56 AM1/18/11
to google-app-...@googlegroups.com
山下@SOBAプロジェクトです。

date変数って元からDate型でしたか?もともとString型で扱っていて、途中から
Date型に変更したと言うことはありませんでしょうか?

データの一部にString型が格納されていて、そのようなエラーが出ている気がします。

開発中のようですので、一度データをクリアしてみるのが良いと思います。

ローカル環境ならlocal_db.binを削除してみるとか。


2011/1/18 としゆき <soic...@gmail.com>:

> --
> このメールは Google グループのグループ「Google-App-Engine-Japan」の登録者に送られています。
> このグループに投稿するには、google-app-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、google-app-engine...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/google-app-engine-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
Daisuke Yamashita

soujiro0725

unread,
Jan 18, 2011, 6:34:53 PM1/18/11
to Google-App-Engine-Japan
仰るとおり、Stringでしたが、途中からDateに変えましたorz
local_db.binはどこのディレクトリにありますか?

としゆき

On 1月19日, 午前1:51, Daisuke Yamashita <dddais...@gmail.com> wrote:
> 山下@SOBAプロジェクトです。
>
> date変数って元からDate型でしたか?もともとString型で扱っていて、途中から
> Date型に変更したと言うことはありませんでしょうか?
>
> データの一部にString型が格納されていて、そのようなエラーが出ている気がします。
>
> 開発中のようですので、一度データをクリアしてみるのが良いと思います。
>
> ローカル環境ならlocal_db.binを削除してみるとか。
>
> 2011/1/18 としゆき <soichi...@gmail.com>:

soujiro0725

unread,
Jan 18, 2011, 7:36:15 PM1/18/11
to Google-App-Engine-Japan
すみません、local_db.binを自分で見つけましたorz

そしてエラーが出ずに実行できました。ありがとうございます!

としゆき
Reply all
Reply to author
Forward
0 new messages