【问题标题】:How to include External packages in a GWT project?如何在 GWT 项目中包含外部包?
【发布时间】:2011-08-30 21:44:36
【问题描述】:
I am new to GWT.
Here is my case.
I have one package which connects to some server (using XmlRpcClient) and get xml-view definition on defined object. (Say this package name in `connection`)
When I run this package separately, it works fine.

Now I want to use this package in GWT project.
I have created one GWT-project (say 'myclient`) and referred `connection` in `Projects` of `myclient` (using eclipse `Java Build Path` option).
I can import `connection`'s classes in GWT-servlet (Say `ViewServiceImpl`) class. but Connection to my server does not establish.

My task is, in `onModuleLoad` I do one RPC call to `ViewServiceImpl` and want to fetch xml-view using `connection` package. But this does not work in GWT.

Note: I have tried to solve the problem by making .jar of `connection` and including it to `Libraries` (using eclipse `Java Build Path` option) of `myclient`. but that too does not work. I am working on Ubuntu.

我可以成功地将 GWT 项目作为 Web 应用程序运行。 但是当我在浏览器中运行给定的 url 时(因此,onModuleLoad 被调用并且它对 servlet ViewServiceImpl 的一种方法进行了 RPC 调用),我得到了以下错误:

[错误] 无法使用 admin:admin@127.0.0.1/designer 连接到 SERVER org.apache.xmlrpc.XmlRpcException:无法创建输入流:无法获取 URL:http://127.0.0.1:8069/xmlrpc/common 在 org.apache.xmlrpc.client.XmlRpcSunHttpTransport.getInputStream(XmlRpcSunHttpTransport.java:99) 在 org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:152) 在 org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:143) 在 org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:69) 在 org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:137) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:126) 在 connection.openerp.OpenERP.loginOpenERP(OpenERP.java:225) 在 connection.openerp.OpenERP.(OpenERP.java:149) 在 connection.openerp.DevelopmentTemplate.(DevelopmentTemplate.java:68) 在 openerp.client.web.server.ViewServiceImpl.getView(ViewServiceImpl.java:19) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:616) 在 com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100) 在 com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 在 com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 原因:java.io.IOException:无法获取 URL:http://127.0.0.1:8069/xmlrpc/common 在 com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:110) 在 com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:41) 在 com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:418) 在 com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:297) 在 com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getResponseCode(URLFetchServiceStreamHandler.java:150) 在 org.apache.xmlrpc.client.XmlRpcSunHttpTransport.getInputStream(XmlRpcSunHttpTransport.java:92) ... 47 更多 造成的: java.io.IOException:无法获取 URL:http://127.0.0.1:8069/xmlrpc/common 在 com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:110) 在 com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:41) 在 com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:418) 在 com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:297) 在 com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getResponseCode(URLFetchServiceStreamHandler.java:150) 在 org.apache.xmlrpc.client.XmlRpcSunHttpTransport.getInputStream(XmlRpcSunHttpTransport.java:92) 在 org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:152) 在 org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:143) 在 org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:69) 在 org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:137) 在 org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:126) 在 connection.openerp.OpenERP.loginOpenERP(OpenERP.java:225) 在 connection.openerp.OpenERP.(OpenERP.java:149) 在 connection.openerp.DevelopmentTemplate.(DevelopmentTemplate.java:68) 在 openerp.client.web.server.ViewServiceImpl.getView(ViewServiceImpl.java:19) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:616) 在 com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100) 在 com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 在 com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) [错误] javax.servlet.ServletContext 日志:调度传入 RPC 调用时出现异常 com.google.gwt.user.server.rpc.UnexpectedException:服务方法 'public abstract openerp.client.web.client.View openerp.client.web.client.ViewService.getView(java.lang.String)' 引发了意外异常:java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission exitVM.-1) 在 com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385) 在 com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 在 com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 在 com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 在 com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 引起:java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission exitVM.-1) 在 java.security.AccessControlContext.checkPermission(AccessControlContext.java:393) 在 java.security.AccessController.checkPermission(AccessController.java:553) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:166) 在 java.lang.SecurityManager.checkExit(SecurityManager.java:761) 在 java.lang.Runtime.exit(Runtime.java:105) 在 java.lang.System.exit(System.java:923) 在 connection.openerp.DevelopmentTemplate.(DevelopmentTemplate.java:72) 在 openerp.client.web.server.ViewServiceImpl.getView(ViewServiceImpl.java:19) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:616) 在 com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100) 在 com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) ... 30 更多

this method is in one of the class of `connection` package, it runs perfect as an individual Java application but throws Exception while calling from GWT-servlet

public boolean loginServer() 抛出 MalformedURLException, XmlRpcException {

    XmlRpcClient xmlrpcLogin = new XmlRpcClient();

    XmlRpcClientConfigImpl xmlrpcConfigLogin = new XmlRpcClientConfigImpl();
    xmlrpcConfigLogin.setEnabledForExtensions(true);

    URL serverURL = null;
    // processing is done with /common, unlike queries (/object)
    serverURL = new URL("http", "127.0.0.1", 8069, "/xmlrpc/common");

    xmlrpcConfigLogin.setServerURL(serverURL);

    xmlrpcLogin.setConfig(xmlrpcConfigLogin);
    // Connect
    Object[] params = new Object[] { "designer", "admin", "admin"};

    Object id = xmlrpcLogin.execute("login", params);// error from this line of code

    if (id instanceof Integer) {
        openERPuserid = ((Integer) id).intValue();
        System.out.println("Userid: " + openERPuserid);
    }

    // return "true" if user id exists
    return (openERPuserid > 0);
}

【问题讨论】:

  • 该软件包是否有任何您可能忘记包含的 conf 文件?
  • 没有包connection的配置文件。
  • 好的,你得到的错误是什么?
  • 有人有解决问题的线索吗?请给我一些时间来解决我的问题,我在谷歌上也找不到任何答案:(
  • 不确定.. 没有看到代码不能说太多。你在使用 GAE 吗?可能是 GAE 限制或不允许调用的问题。

标签: java security gwt servlets xml-rpc


【解决方案1】:

在我看来,此异常不像 GWT 的一部分。看起来服务器端的RPC方法的实现是在抛出它:

 Service method 'public abstract openerp.client.web.client.View openerp.client.web.client.ViewService.getView(java.lang.String)' threw an unexpected exception: java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.-1) at 

您可能可以通过在该方法中设置断点来缩小问题范围。

在 onModuleLoad() 中缩小异常范围的一个技巧是从那里取出所有代码。在这种情况下,它会变得更清晰一些,因为 UI 不会抛出丑陋的堆栈跟踪而不是你的首页。

@Override
  public void onModuleLoad() {
    logger.log(Level.INFO, "Deferring Startup...");
    // Hack to allow the UI to come up even if an exception occurs.
    Scheduler.get().scheduleDeferred(new ScheduledCommand() {
      @Override
      public void execute() {
        doOnModuleLoad();
      }
    });
  }

  public void doOnModuleLoad() {
   ... (the real onmodule load logic) ...

【讨论】:

  • 是的,问题在于执行我的connection 服务器的 RPC 方法(我从 GWT-servlet 调用这个 RPC)。我正在粘贴异常引发的确切位置。
猜你喜欢
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2012-05-18
  • 2021-07-29
相关资源
最近更新 更多