The net is vast
プログラミングや、コンピュータなどの備忘録です。 主にRuby, Java, Linux, 等を扱います。アルゴリズムも扱いたいな。
ラベル GAE の投稿を表示しています。 すべての投稿を表示
ラベル GAE の投稿を表示しています。 すべての投稿を表示
20:57

Slim3で同名のクラスでClassCastException

Category: , By jx
Slim3で開発しています。 JSPで次のような事をしたところ、例外が発生してしまいました。
<%
List<HotEntry> hotEntryList = (List<HotEntry>) request.getAttribute("hotEntryList");
for (HotEntry entry : hotEntryList) {
%>
<%= entry.getUrl() %>
<%
}
%>
エラーは以下の通り。
java.lang.ClassCastException: net.jirox.acom.model.HotEntry cannot be cast to net.jirox.acom.model.HotEntry
 at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
 at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
 at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
 at java.security.AccessController.doPrivileged(Native Method)
 at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
 at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:288)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:247)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
 at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:268)
 at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
 at org.slim3.controller.HotRequestDispatcherWrapper.forward(HotRequestDispatcherWrapper.java:67)
 at org.slim3.controller.FrontController.doForward(FrontController.java:696)
 at org.slim3.controller.FrontController.doForward(FrontController.java:667)
 at org.slim3.controller.FrontController.handleNavigation(FrontController.java:587)
 at org.slim3.controller.FrontController.processController(FrontController.java:544)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:324)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:285)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:247)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:54)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.slim3.controller.HotReloadingFilter.doHotReloading(HotReloadingFilter.java:223)
 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:1084)
 at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:121)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
 at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:352)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
 at org.mortbay.jetty.Server.handle(Server.java:313)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
 at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
 at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
 at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
 at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
なんだろう。クラスローダが違うのかな?
List hotEntryList = (List) request.getAttribute("hotEntryList");
System.out.println(HotEntry.class.getClassLoader());
System.out.println(hotEntryList.getClass().getClassLoader());
上記のコードを実行してみた。
com.google.appengine.tools.development.IsolatedAppClassLoader@680e2291
null
ん〜?null?こういうコードってこういう風になるんだっけ? どうしたら良いんだろう。
 
16:48

GAE/Jのローカル管理コンソール

Category: , By jx

GAEで開発しているとどんなデータがデータストアに格納されているかがわかりにくいですよね。 そんなときに便利なのが管理コンソール。デフォルトで付属しています。

http://localhost:8888/_ah/admin/datastore

実はちょっと前まで知りませんでした。これで少しは開発が楽になるかな。

 
16:36

Slim3のDatastoreはJDOとは全く異なる

Category: , By jx
Slim3を触っています。今、Entityあたりを勉強しているのですが、ずいぶんとJDOと違いますね。まぁもちろん、制約とは同じなんですが、同じEntity Groupにしようと思ってプロパティに
List hoge;
とすると、
[SLIM3GEN1005] Specify @Attribute(lob = true) or @Attribute(persistent = false).
と言われてしまう。 もう少し勉強が必要そうですね。
 
1:42

Slim3のチュートリアルでjava.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM

Category: , By jx
Google App Engineでアプリでもこさえてみようかと考えています。 GAEといえばSlim3だろうということで、とりあえずはじめてみます。 と思ってチュートリアルを始めたらいきなり躓いた。躓いたのはCreating a controller and a test (Slim3) gen-controller taskを実行しようとすると、下のようなエラーが表示されてしまう。
java.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM
何故だろうと調べていたら自分の環境が64bitのMac環境だったためにおこった模様。 ちなみに、Snow Leopardです。 だから、Eclipseの64bit環境用のものを使用すれば問題ありません。 Eclipse Project DownloadsからたどってMac OSXの64bit用Eclipseを落としてきてください。これで解決です。 やっと、チュートリアルに入れる。
 
1:37

GAE/JでXMLを操る

Category: By jx
GAE/Jで開発をしていると、どうしてもXMLを操らなきゃいけないときがあります。開発機でRomeを使って動いたぞと思って本番環境にデプロイしても動作しません。下のような例外が発生してしまいます。
Could not load default SAX parser
なんて言われてしまいます。これを解決するにはxercesの次のjarが必要になります。
  • serializer.jar
  • xercesImpl.ja
  • xercesSamples.jar
  • xml-apis.jar
これでも実はまだ足りません。XPathを使おうと思っても、xercesにはXPathのAPIは用意されておらず、
XPathFactory.newInstance()
上のようにするとやはり例外が発生してしまいます。
XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFactory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom
これを解決するには、xalanが必要になります。 結局、xalanにはxercesが含まれている?ので結局、xalan-j_2_7_1の以下のjarをWEB-INF/libの下に配置します。
  • serializer.jar
  • xalan.jar
  • xercesImpl.jar
  • xml-apis.jar
  • xsltc.jar
さらに、
XPathFactory.newInstance()
のように書いてもダメで、次のように書かなければ行けません。
new org.apache.xpath.jaxp.XPathFactoryImpl();
まとめると、
  1. Romeを使用して
  2. xalanのjarを使って
  3. new org.apache.xpath.jaxp.XPathFactoryImpl()で、Factoryを作成します
 
20:16

GAE/Jでparentは変更出来ないけど、childは追加可能

Category: By jx
タイトルのまんま。
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
 Parent parent = pm.getObjectById(Parent.class, "hoge");
 List childList = parent.getChildList();
 int r = (int) Math.floor(Math.random() * 100000);
 childList.add(new Child(KeyFactory.createKey(Child.class
   .getSimpleName(), "fuga" + r)).setName("fuga" + r));
 
} finally {
 pm.close();
}
もちろん、削除もできる。
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
 Parent parent = pm.getObjectById(Parent.class, "hoge");
 List childList = parent.getChildList();
 Child child = childList.get(0);
 pm.deletePersistent(child);
} finally {
 pm.close();
}
 
19:51

GAE/Jのparentとchildは変更出来ない?

Category: By jx
一度作成したオブジェクトをほか子供にしようとしたら
try {
 Parent p = new Parent("hoge");
 Key cKey = KeyFactory.createKey(
  Child.class.getSimpleName(), "fuga");
 Child c = new Child(cKey);
 pm.makePersistent(c);
 pm.makePersistent(p);
 p.setChild(c);
} finally {
 pm.close();
}
Detected attempt to establish Parent(hoge) as the parent of Child(fuga) but the entity identified by Child(fuga) has already been persisted without a parent. A parent cannot be established or changed once an object has been persisted.
と言われてしまった。つまり、一度parentを設定してしまったら、変更は不可能の模様。これって要するに1レコードでデータが格納されるということなんだろうか。 なかなか難しいですな
 
2:59

GAE/JavaのQueryでは!=演算子はサポートされない

Category: By jx
GAEのQueryを触っていてハマった。
Query pageQuery = pm.newQuery(Page.class);
pageQuery.setFilter("body != null");
SQLの気分で、上のように書いていたら、エラーがでてしまう。
App Engine datastore does not support operator <>
ってでてしまう。すごいハマった。ドキュメントをちゃんと読んでみたら、jdoqlでは!=演算子はサポートされないらしい。ちゃんと書いてあるじゃないですか。
Note: The Java datastore interface does not support the != and IN filter operators that are implemented in the Python datastore interface. (In the Python interface, these operators are implemented in the client-side libraries as multiple datastore queries; they are not features of the datastore itself.)
 
0:24

GAE/JavaのJDOでPrimaryKeyをStringにすると厄介

Category: By jx
GAE/JavaのJDOでPrimaryKeyをStringにすると厄介です。
@PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private String primaryKey;
こんな風にすると、primaryKeyは数字で始まることができないようです。
Name may not start with a digit
というようにおこられてしまいます。 数値で始まるPrimaryKeyを主キーにしたい場合にはどうしたら良いんでしょう。というかまだ、JDOが全然わかってません。誰か、あのドキュメントを翻訳して。。。