こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Google Web Toolkit(GWT)でのMySqlの接続

こんにちは。現在GWT勉強中なのですが、MySqlの接続で大ハマリしています。どなたかご教示ください。

環境は以下のとおりです。
GWT:1.6.4
Eclipse:3.4.2
MySQL:5.1.31
MySQLConnector/J:5.1.7



EclipseでWeb Application Projectを作成し、デフォルトで作られる「GreetingServiceImpl」クラスの「public String greetServer(String input)」の中身を以下のように変更しました。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
public String greetServer(String input) {
String msg = "";
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://localhost/gwt_samples";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
msg = "成功";
}
catch(Exception e)
{
msg = "失敗";
}
return msg;
}
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

初めはClass.forName()の行で「java.lang.ClassNotFoundException: com.mysql.jdbc.Driver」が発生していましたが、/war/WEB-INF/libにMySQLConnector/JのJARファイルを追加することで発生しなくなりました。

しかし今度は、DriverManager.getConnectionでおかしくなっているようなんですが、その行でステップ実行すると、「RPC.class」の「invokeAndEncodeResponse()」というメソッドの「catch InvocationTargetException e) 」のところまでジャンプしてしまいます。

どなたか分かる方教えてください。
また、不明点あればご指摘ください。

投稿日時 - 2009-05-09 13:38:24

QNo.4944004

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

スタックトレースを拝見したところ、Exceptionが発生している根本の原因は

java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.ConnectionImpl

のところだと思います。

つまり、実行時にcom.mysql.jdbc.Driverクラスは見つかったにも関わらず、com.mysql.jdbc.ConnectionImplクラスが何らかの理由で見つからなかったのでしょう。

もう1度実行環境、特にCLASSPATHを確認してみて下さい。

なお補足になりますが、hiro19834さんが変更されようとしているソースはサーバ側のソースですので、これはGoogle App Engine上で実行されていると思います。

App Engine上でJDBCを利用して直接DBアクセスする例は私も見たことがないので自信がありませんが、この場合JDO(Java Data Objects)経由でDBアクセスする必要があると思います。

JDO経由でもできるかどうか自信がありませんが・・・。

参考URL:http://code.google.com/intl/ja/appengine/docs/java/gettingstarted/usingdatastore.html

投稿日時 - 2009-05-10 21:19:23

お礼

x_jouet_xさん回答ありがとうございます。
ちょっと勉強不足だったようです。いろいろとキーワードを与えてくださってありがとうございます。勉強しなおしたいと思います。

投稿日時 - 2009-05-12 20:18:41

ANo.1

AjaxやGWTではなく、JavaでのExceptionの話ですよね?
InvocationTargetExceptionだけでは原因が特定できないので、

catch(Exception e)
{
msg = "失敗";
}

と記述されているところを

catch(Exception e)
{
e.printStackTrace();
}

に変更して、これで実行時に表示される内容を教えて頂けないでしょうか?

投稿日時 - 2009-05-09 20:43:27

補足

x_jouet_xさん、回答ありがとうございます。
「e.printStackTrace();」ですが、なぜか「catch(Exception e)」で例外をキャッチできておらず、質問に書いたように「RPC.class」までジャンプしてしまいます。

ですが出力には以下の内容が吐き出されておりました。

2009/05/09 23:50:58 com.google.appengine.tools.development.ApiProxyLocalImpl log
SEVERE: [1241880658015000] javax.servlet.ServletContext log: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String connectsample.client.GreetingService.greetServer(java.lang.String)' threw an unexpected exception: java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.ConnectionImpl
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:360)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:546)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
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 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
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:54)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
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.content(HttpConnection.java:844)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
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)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.ConnectionImpl
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at connectsample.server.GreetingServiceImpl.greetServer(GreetingServiceImpl.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
... 25 more

ちなみに「e.printStackTrace();」を追加してもしなくても出力されています。

投稿日時 - 2009-05-09 23:59:07

あなたにオススメの質問