WebサービスからJSON応答を取得するために、GWTサーブレットからget要求を作成しようとしています。以下は私のサーブレットのコードです:
public String getQueData() throws IllegalArgumentException {
String message = null;
try {
HttpClient httpclient = new DefaultHttpClient();
JSONParser parser = new JSONParser();
String url = "working - url";
HttpResponse response = null;
response = httpclient.execute(new HttpGet(url));
JSONObject json_data = null;
json_data = (JSONObject)parser.parse(EntityUtils.toString(response.getEntity()));
JSONArray results = (JSONArray)json_data.get("result");
for (Object queid : results) {
message = message.concat((String) ((JSONObject)queid).get("id"));
message = message.concat("\t");
message = message.concat((String) ((JSONObject)queid).get("owner"));
message = message.concat("\n");
}
} catch (Exception e) {
message = e.toString();
}
return message;
}
GWTサーブレットからget要求を作成しようとすると、次の例外を取得します。
Java.lang.NoClassDefFoundError: org/Apache/http/client/HttpClient
at Java.lang.Class.getDeclaredConstructors0(Native Method)
at Java.lang.Class.privateGetDeclaredConstructors(Class.Java:2389)
at Java.lang.Class.getConstructor0(Class.Java:2699)
at Java.lang.Class.newInstance0(Class.Java:326)
at Java.lang.Class.newInstance(Class.Java:308)
at org.mortbay.jetty.servlet.Holder.newInstance(Holder.Java:153)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.Java:428)
at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.Java:339)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.Java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1166)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.Java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.Java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.Java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.Java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.Java:97)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.Java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.Java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.Java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.Java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.Java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.Java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.Java:78)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.Java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.Java:362)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.Java:152)
at org.mortbay.jetty.Server.handle(Server.Java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.Java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.Java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.Java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.Java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.Java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.Java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.Java:582)
Caused by: Java.lang.ClassNotFoundException: org.Apache.http.client.HttpClient
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:306)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.Java:176)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:247)
この例外の考えられる原因は何ですか?どのように削除できますか?
私はubuntu 10.04でjdk1.6.0_30を使用しています。
この例外の考えられる原因は何ですか?
クラスパスに適切なJarがない場合があります。
どのように削除できますか?
HTTPClient jarをクラスパスに配置します。 webappの場合、JarをWEB-INF/lib
にコピーします。スタンドアロンの場合は、このjarがクラスパスにあることを確認するか、-cp
オプションを使用して明示的に設定します。
doc が言うように、
Java仮想マシンまたはClassLoaderインスタンスが(通常のメソッド呼び出しの一部として、または新しい式を使用して新しいインスタンスを作成する一部として)クラスの定義をロードしようとした場合にスローされます。クラスが見つかりました。
現在実行中のクラスがコンパイルされたときに、検索対象のクラス定義が存在していましたが、定義が見つかりません。
編集:
Maven/Gradle(以下の回答を参照)またはSBTなどの依存関係管理を使用している場合は、それを使用してhttpclient jarを提供してください。
Mavenプロジェクトの場合、pomファイルに以下の依存関係を追加します
<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.4</version>
</dependency>
私は同じ問題に直面していました。私の場合、sendgridには新しいバージョンのhttpclientが必要でしたが、古いバージョンにはhttpclientの依存関係がありました。 httpclientのバージョンが依存関係で正しいことを確認してください。正常に動作します。
私はこの問題を自分で解決しましたが、他の依存するjarファイルの異なるバージョンを持つhttp-clientの2つのファイルがあることがわかりました。したがって、ライブラリファイル間でバージョンが折りたたまれている可能性があるため、すべての古い/以前のライブラリファイルを削除し、このZipファイルのlibフォルダーからjarファイルを再追加します。
この問題は、jarバージョンが異なる場合に発生します。特にhttpcoreとhttpclientのバージョン。同じバージョンのhttpcoreとhttpclientを使用します。