【问题标题】:error when I use GWT RPC使用 GWT RPC 时出错
【发布时间】:2011-01-08 10:04:27
【问题描述】:

我在使用 RPC 时遇到了 Eclipse 的问题。 如果我使用单个方法调用,这一切都是正确的方向,但如果我添加一个新方法来处理服务器,我会收到以下错误:

com.google.gwt.core.client.JavaScriptException: (null): null
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:237)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeBoolean(ModuleSpace.java:184)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeBoolean(JavaScriptHost.java:35)
    at com.google.gwt.user.client.rpc.impl.RpcStatsContext.isStatsAvailable(RpcStatsContext.java)
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:221)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214)
    at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
    at java.lang.Thread.run(Thread.java:619)

我可以在异步调用中拥有更多服务吗?我哪里错了?

这是我的 MyService 实现:

package de.vogella.gwt.helloworld.client;

import com.google.gwt.user.client.rpc.RemoteService;

public interface MyService extends RemoteService {
    //chiamo i metodi presenti sul server

    public void creaXML(String nickname,String pass,String email2,String gio,String mes, String ann);

    public void setWeb(String userCorrect,String query, String titolo,String snippet,String url);
}

MyServiceAsync

package de.vogella.gwt.helloworld.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

public interface MyServiceAsync {

    void creaXML(String nickname,String pass,String email2,String gio,String mes, String ann,AsyncCallback<Void> callback);

    void setWeb(String userCorrect,String query, String titolo,String snippet,String url, AsyncCallback<Void> callback);
}

RPC 服务:

package de.vogella.gwt.helloworld.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.FlexTable;

public class RPCService implements MyServiceAsync {
     MyServiceAsync service = (MyServiceAsync) GWT.create(MyService.class);
     ServiceDefTarget endpoint = (ServiceDefTarget) service;


        public RPCService()
        {
            endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "rpc");

        }


        public void creaXML(String nickname,String pass,String email2,String gio,String mes, String ann,AsyncCallback callback)
        {
            service.creaXML(nickname, pass, email2, gio, mes, ann, callback);
        }

        public void setWeb(String userCorrect,String query, String titolo,String snippet,String url,AsyncCallback callback) {

            service.setWeb(userCorrect,query, titolo,snippet,url,callback);

        }
}

我的服务实现

package de.vogella.gwt.helloworld.server;

import java.io.*;

import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import de.vogella.gwt.helloworld.client.MyService;

import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.gwt.xml.client.Element;
import com.google.gwt.xml.client.NodeList;

public class MyServiceImpl extends RemoteServiceServlet implements MyService {
    //metodo che inserisce il nuovo iscritto
    public void creaXML(String nickname,String pass,String email2,String gio,String mes, String ann){
        .......
    }

    public void setWeb(String userCorrect,String query, String titolo,String snippet,String url) {
        .....
    }

在客户端的应用程序中我这样做

RPCService rpc2 = New RPCService()
rpc2.setWeb(..,...,...,...,callback);

RPCService rpc = New RPCService()
rpc.creaXML(..,...,...,...,callback); (in other posizions in the code...)

和..

AsyncCallback callback = new AsyncCallback()
{
    public void onFailure(Throwable caught)
    {
        Window.alert("Failure!");
    }

    public void onSuccess(Object result)
    {

        Window.alert("Successoooooo");


    }
}; 

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <!-- Servlets -->

  <!-- Default page to serve -->
  <welcome-file-list>
    <welcome-file>De_vogella_gwt_helloworld.html</welcome-file>
  </welcome-file-list>

  <servlet>
  <servlet-name>rPCImpl</servlet-name>
  <servlet-class>de.vogella.gwt.helloworld.server.MyServiceImpl</servlet-class>
  </servlet>

  <servlet-mapping>
   <servlet-name>rPCImpl</servlet-name>
   <url-pattern>/de_vogella_gwt_helloworld/rpc</url-pattern>
 </servlet-mapping>

</web-app>

感谢大家的关注

西贝

【问题讨论】:

  • 请更正代码格式并确保代码可以编译。在 RPCService 类中,类主体中有以下代码:MyServiceAsync service = (MyServiceAsync) GWT.create(MyService.class); ServiceDefTarget endpoint = (ServiceDefTarget)。不应该在构造函数中吗?
  • 如果我插入 MyServiceAsync service = (MyServiceAsync) GWT.create(MyService.class); ServiceDefTarget 端点 = (ServiceDefTarget) 服务,在构造函数中,在要实现的方法中引发 errpr :(

标签: gwt gwt-rpc asynccallback


【解决方案1】:

您似乎以一种奇怪的方式调用您的 RPC 服务。

在 GWT 网页中有一个 tutorial 显示应该如何完成此操作。

编辑:

This bug 在 GWT 错误数据库中报告可能与您的问题有关(堆栈跟踪非常相似)。也可以在here找到有关该错误的一些信息。

【讨论】:

  • 我遵循了这个教程:examples.roughian.com/index.htm#Tutorials~RPC_To_Java 如果我只使用一种方法(creaXMl 或 setWeb)它可以工作,但如果我同时使用它们就不起作用.. 它会是什么?感谢回复
  • 我了解问题所在。该错误是在调用 FlexTable 中的单击操作时导致的。这是因为如果启动任何其他部分的方法,它工作正常。我该如何解决这个问题?我用强制表.....:(
  • 我一直在 GWT 错误数据库中查找有关您的堆栈跟踪的信息,令人惊讶的是我找到了 this bug。这可能是你的问题。看看它(错误的 cmets 中建议了一些可能的解决方案 - 也许其中一些会对您有所帮助)。
【解决方案2】:

我丢失了我的通行证,我重新创建了帐户...我看到了您的板..这是我的浏览器网络的问题...如果我使用 Internet Explorer,它可以正常工作,但如果我使用 Firefox(我的预定浏览器)抛出异常(但它编译得很好)。我还没有找到任何可以解决的问题...

【讨论】:

  • 你看过我在回答中提到的the GWT bug吗?当您在 Firefox 中运行应用程序时,报告存在该错误(就像您的情况一样)。 Some people 建议清除 Firefox 历史记录有帮助,some other 建议从 gwt.xml 文件中删除 &lt;set-property name="user.agent" value="ie6"&gt; 行(如果文件中存在该行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多