【问题标题】:how to run actual java in the backend of gwt web application如何在 gwt Web 应用程序的后端运行实际的 java
【发布时间】:2012-03-09 13:52:07
【问题描述】:

对于我项目中的特定需求,我想从 Web 服务 api 检索 JSON 响应。

我在一个运行良好的简单 Java 项目中尝试了 Java 代码。

String message = null;
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");
}

如果我尝试在 GWT 应用程序 servlet 中运行此代码,我会收到一些编译错误。

[ERROR] Line 16: No source code is available for type org.apache.http.client.ClientProtocolException; did you forget to inherit a required module?
[ERROR] Line 16: No source code is available for type org.apache.http.ParseException; did you forget to inherit a required module?
[ERROR] Line 16: No source code is available for type org.json.simple.parser.ParseException; did you forget to inherit a required module?

我已经使用项目构建路径添加了所需的 jar ->添加外部 jar。 但我仍然面临同样的问题。 我已经尝试将源附加到罐子上,但问题仍然相同。

在这种情况下可以做些什么? 我可以在我的 GWT 应用程序的后端运行实际的 java

编辑#1:

这段代码是用我的 GWT servlet 编写的。我尝试在我的 servlet 方法中添加 throws 子句并应用 try/catch 块。但我仍然收到这些错误。

编辑#2:

应用 try/catch 块后,我的控制台日志中出现以下错误。

Mar 10, 2012 1:16:28 PM com.google.appengine.tools.development.ApiProxyLocalImpl log
SEVERE: javax.servlet.ServletContext log: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String com.google.detracker.client.DeService.getJSONRespnse()' threw an unexpected exception: java.lang.NoClassDefFoundError: javax.net.ssl.KeyManagerFactory is a restricted class. Please see the Google  App Engine developer's guide for more details.
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    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:58)
    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.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
    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.NoClassDefFoundError: javax.net.ssl.KeyManagerFactory is a restricted class. Please see the Google  App Engine developer's guide for more details.
    at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
    at org.apache.http.conn.ssl.SSLSocketFactory.createSSLContext(SSLSocketFactory.java:184)
    at org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext(SSLSocketFactory.java:209)
    at org.apache.http.conn.ssl.SSLSocketFactory.<init>(SSLSocketFactory.java:333)
    at org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory(SSLSocketFactory.java:165)
    at org.apache.http.impl.conn.SchemeRegistryFactory.createDefault(SchemeRegistryFactory.java:45)
    at org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:294)
    at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:445)
    at org.apache.http.impl.client.AbstractHttpClient.createHttpContext(AbstractHttpClient.java:274)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:797)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at com.google.detracker.server.DeServiceImpl.getJSONRespnse(DeServiceImpl.java:32)
    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.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
    ... 34 more

Mar 10, 2012 1:16:28 PM com.google.appengine.tools.development.LocalResourceFileServlet doGet

【问题讨论】:

  • 在 GWT 站点上,您只能使用有限的类子集。请参阅 gwt 文档。见JRE Emulation Reference
  • @AdelBoutros,你检查过我的编辑#1,我认为你是对的。但我不明白,我应该在哪里处理这些异常。
  • @AdelBoutros,查看我最新的编辑#2
  • 所以你的实际错误是:Caused by: java.lang.NoClassDefFoundError: javax.net.ssl.KeyManagerFactory is a restricted class

标签: java gwt servlets request response


【解决方案1】:

如果你注意的话,这个错误是关于一个异常类的。这意味着您的代码正在返回一个您没有处理的异常。 type org.apache.http.client.ClientProtocolException

尝试用 try catch 块包围你的代码,看看你在开发控制台中得到了什么。

Try {
    String message = null;
    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) {
    e.printStack();
}

解释:

为所有想要它的人提供更多解释。在您的代码中,您不使用try catch blocks 处理异常。因此,当引发异常时,服务器会将其发送回客户端,但大多数异常是 NOT serializable,因此无法将它们传输回客户端客户端,这就是您收到上述错误的原因。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    是的,您可以,但错误消息表明您在客户端代码的某个位置导入了一个使用这些服务器端外部 jar 的类。

    编辑:根据 Adel Boutros 的回答,我猜您已将 throws 添加到生成这些错误的类的 GWT 服务接口中?您只能抛出客户端也可用的异常,因此在服务器上捕获它们并重新抛出客户端可用的新异常。

    【讨论】:

      【解决方案4】:

      如果这些库实际上可以在 GWT 中使用,则必须在 application.gwt.xml 文件中添加行以继承模块。

      smartgwt 库示例:

      <?xml version="1.0" encoding="UTF-8"?>
      
      <!-- Inherit the core Web Toolkit stuff.                        -->
      <inherits name='com.google.gwt.user.User'/>
      
      <!-- Other module inherits                                      -->
      <inherits name="com.smartgwt.SmartGwt"/>
      
      <!-- Specify the app entry point class.                         -->
      <entry-point class='blablabla'/>
      
      <!-- Specify the paths for translatable code                    -->
      <source path='client'/>
      <source path='shared'/>
      

      【讨论】:

      • 什么库?缺少的是一个异常类,这意味着触发了异常
      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2022-11-21
      相关资源
      最近更新 更多