0

我现在正在使用 rpc 从我的数据库中提取数据,但是每当我单击该按钮时,它都会生成一个错误,并且我的onFailure命令总是被触发。

下面是我的程序代码。

public class PleaseWork implements EntryPoint {
private TextBox textbox2 = new TextBox();
private Label Hi = new Label("New label");

@SuppressWarnings("deprecation")
public void onModuleLoad() {
    RootPanel rootPanel = RootPanel.get();

    Button btnNewButton = new Button("New button");

    btnNewButton.addClickListener(new ClickListener() {
        public void onClick(Widget event) {

            HelpConnectionAsync Abra =(HelpConnectionAsync) GWT.create(HelpConnection.class);
            ServiceDefTarget target = (ServiceDefTarget) Abra;
            String moduleRelativeURL = GWT.getModuleBaseURL() + "MySQLConnection";
            target.setServiceEntryPoint(moduleRelativeURL);

            AsyncCallback callback = new AsyncCallback(){

            public void onSuccess (Object result){
                textbox2.setText((String)result);
                Hi.setText("You Pass!");
            }
            public void onFailure(Throwable caught) {
                caught.printStackTrace();
                Hi.setText("You fail!");

            }
            };
            Abra.sensors(callback);
        }
    });

    rootPanel.add(btnNewButton, 23, 30);
    rootPanel.add(textbox2,23, 70);     
    rootPanel.add(Hi, 23, 130);
}

}

这包括我的异步和服务程序

public interface HelpConnection extends RemoteService {
public String[] sensors() throws Exception;}
public interface HelpConnectionAsync {
public void sensors(AsyncCallback<String[]> callback);}

这是我的服务器端程序

public class MySQLConnection extends RemoteServiceServlet implements HelpConnection {
private Connection conn = null;
private ResultSet rs = null;
private PreparedStatement pstmt = null;

public static Connection getConnection() throws Exception {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/temperature";
    String username = "root";
    String password = "123456";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
  }

@Override
public String[] sensors() throws Exception {
    String [] user = null;
    try {
          conn = getConnection();

          rs = pstmt.executeQuery("SELECT ID, times FROM sensor ORDER BY id DESC LIMIT 1;");
          // extract data from the ResultSet
          while (rs.next()) {
            user = new String[] {rs.getString(1),rs.getString(2)};
          }
        } catch(SQLException e) {
          e.printStackTrace();
        } finally {
          try {
            rs.close();
            pstmt.close();
            conn.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        return user;
}}

最后这是控制台生成的代码

java.lang.NullPointerException
    at com.google.gwt.user.client.rpc.core.java.lang.NullPointerException_FieldSerializer.instantiate(NullPointerException_FieldSerializer.java:16)
    at com.google.gwt.user.client.rpc.core.java.lang.NullPointerException_FieldSerializer.create(NullPointerException_FieldSerializer.java:25)
    at com.google.gwt.user.client.rpc.impl.SerializerBase.instantiate(SerializerBase.java:115)
    at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:396)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:216)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412)
    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.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:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
    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:242)
    at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    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:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
    at java.lang.Thread.run(Unknown Source)

开发模式错误

[ERROR] Uncaught exception escaped

com.google.gwt.event.shared.UmbrellaException:捕获到异常:com.google.gwt.user 的 com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:129) 未指定服务实现 URL。 com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116) 上 com.google.gwt.user.client.ui 上的 client.ui.Widget.fireEvent(Widget.java:129)。 com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351) 上的 Widget.onBrowserEvent(Widget.java:177) com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:第1307章、来源)在 com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 在 com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 在 com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) 在 com.google .gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338) at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219) at com.google.gwt.dev.shell.ModuleSpaceOOPHM .doInvoke(ModuleSpaceOOPHM.java:136) 在 com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571) 在 com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279) ) 在 com.google.gwt.core.client.impl.Impl.apply(Impl.java) 在 com.google.gwt 的 com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)。 core.client.impl.Impl.entry0(Impl.java:242) 在太阳。reflect.GeneratedMethodAccessor43.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.google.gwt.dev.shell.MethodAdaptor.invoke( MethodAdaptor.java:103) 在 com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 在 com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) 在 com .google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) 在 com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547) 在 com.google.gwt.dev.shell .BrowserChannelServer.run(BrowserChannelServer.java:364) at java.lang.Thread.run(Unknown Source) 原因:com.google.gwt.user.client.rpc.ServiceDefTarget$NoServiceEntryPointSpecifiedException:服务实现 URL 未在 com.google.gwt.user.client.rpc.impl.RemoteServiceProxy.doInvoke(RemoteServiceProxy.doPrepareRequestBuilderImpl(RemoteServiceProxy.java:430) 处指定.java:368) 在 com.google.gwt.user.client.rpc.impl.RemoteServiceProxy$ServiceHelper.finish(RemoteServiceProxy.java:74) 在 com.mycompany.project.client.HelpConnection_Proxy.sensors(HelpConnection_Proxy.java:30 ) 在 com.mycompany.project.client.PleaseWork$1.onClick(PleaseWork.java:30) 在 com.google.gwt.user.client.ui.ListenerWrapper$WrappedClickListener.onClick(ListenerWrapper.java:245) 在 com.google .gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:56) 在 com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:1) 在 com.google.gwt.event .shared.GwtEvent.dispatch(GwtEvent.java:1) 在 com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:193) 在 com.google.web.bindery.event.shared.EventBus.dispatchEvent(EventBus.java:40) 在 com .google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88) 在 com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:127) 在 com.google.gwt.user .client.ui.Widget.fireEvent(Widget.java:129) 在 com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116) 在 com.google.gwt.user.client.ui .Widget.onBrowserEvent(Widget.java:177) 在 com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351) 在 com.google.gwt.user.client.DOM.dispatchEvent(DOM.java :1307) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 在 sun.reflect。DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) at com.google.gwt.dev .shell.MethodDispatch.invoke(MethodDispatch.java:71) 在 com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172) 在 com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer .java:338) 在 com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219) 在 com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136) 在 com。 com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279) 上 com.google.gwt.dev.shell 上的 google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)。 JavaScript主机。在 com.google.gwt.core.client.impl.Impl.apply(Impl.java) 上调用NativeObject(JavaScriptHost.java:91) 在 com.google.gwt.core.client.impl.Impl.entry0(Impl.java: 242) 在 sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.google.gwt.dev.shell .MethodAdaptor.invoke(MethodAdaptor.java:103) 在 com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 在 com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java :172) com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547) com.google。 gwt.dev.shell.BrowserChannelServer。在 java.lang.Thread.run 运行(BrowserChannelServer.java:364)(未知来源)

另一次尝试基于将返回用户更改为返回 String[] {"text1","text2"} 在 Developmentmode 中再次生成了此错误,

[ERROR] Uncaught exception escaped

java.lang.ClassCastException: [Ljava.lang.String; 无法在 com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter .java:232) 在 com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258) 在 com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412) 在 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.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 在 com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:

4

3 回答 3

0

你定义了一个方法

public String[] sensors() throws Exception;

期望 String[] 的返回值。

在您的调用中,您将返回值作为字符串处理:

    AsyncCallback callback = new AsyncCallback(){

    public void onSuccess (Object result){
        textbox2.setText((String)result);
        Hi.setText("You Pass!");
    }
    public void onFailure(Throwable caught) {
        caught.printStackTrace();
        Hi.setText("You fail!");

    }
    };

事实上,它不是一个String,它是一个String[]。将您的代码更改为:

        AsyncCallback<String[]> callback = new AsyncCallback<String[]>(){

        public void onSuccess (String[] result){
            textbox2.setText(result[0]);
            Hi.setText("You Pass!");
        }
        public void onFailure(Throwable caught) {
            caught.printStackTrace();
            Hi.setText("You fail!");

        }
        };

这会将返回值正确处理为 String[]。

接下来要改进的是您的服务器部分:

首先,如果你在服务器端捕获了一个异常,你不会把它抛给客户端。在您的情况下,您捕获 SQLException 并继续进行,就好像服务器上的一切正常。添加一个 throw 语句会告诉客户端,服务器出了问题。

public String[] sensors() throws Exception {
    String [] user = null;
    try {
          conn = getConnection();

          rs = pstmt.executeQuery("SELECT ID, times FROM sensor ORDER BY id DESC LIMIT 1;");
          // extract data from the ResultSet
          while (rs.next()) {
            user = new String[] {rs.getString(1),rs.getString(2)};
          }
        } catch(SQLException e) {
          e.printStackTrace();
          throw new MyException();
        } finally {
          try {
            rs.close();
            pstmt.close();
            conn.close();
          } catch (SQLException e) {
            e.printStackTrace();
            throw new MyException();
          }
        }
        return user;
}}

如果您在数据库中找不到任何内容,则 yow 将返回 null。在将值设置为小部件之前,您必须检查您的返回值是否不为空。

    public void onSuccess (String[] result) {
        if (result != null)
          textbox2.setText(result[0]);
        }
        Hi.setText("You Pass!");
    }

在这种情况下,我个人更喜欢使用 List 。因为,您可以在不知道将返回多少值的情况下创建列表。

于 2013-11-03T08:33:34.670 回答
0

我从您的 PleaseWork 课程中删除了 ServiceDefTarget。它只是一个工作的基础,现在你只需要添加你的数据库处理。我也改变了回调的类型。它现在对我有用(我删除了一些代码以减少代码量):

public void onModuleLoad() {
    RootPanel rootPanel = RootPanel.get();

    Button btnNewButton = new Button("New button");

    btnNewButton.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            HelpConnectionAsync Abra = (HelpConnectionAsync) GWT
                    .create(HelpConnection.class);

            AsyncCallback<String[]> callback = new AsyncCallback<String[]>() {

                public void onSuccess(String[] result) {
                    textbox2.setText(result[0]);
                    Hi.setText("You Pass!");
                }

                public void onFailure(Throwable caught) {
                    caught.printStackTrace();
                    Hi.setText("You fail!");

                }
            };
            Abra.sensors(callback);

        }
    });

在您的原始帖子中没有 servlet 映射,所以我添加了它:

@RemoteServiceRelativePath("Connection")
public interface HelpConnection extends RemoteService {
public String[] sensors() throws Exception;}

和异步对应物:

public interface HelpConnectionAsync {
public void sensors(AsyncCallback<String[]> callback);}

MySQLConnection 的重要部分:

@SuppressWarnings("serial")
public class MySQLConnection extends RemoteServiceServlet implements HelpConnection {


@Override
public String[] sensors() throws Exception {
String [] user = {"test"};
    return user;
}}

除了 Java 类之外,我还使用了以下 web.xml ( /war/WEB-INF/web.xml )

    ....
     <!-- Servlets -->
  <servlet>
    <servlet-name>servletName</servlet-name>
    <servlet-class>src.server.MySQLConnection</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>servletName</servlet-name>
    <url-pattern>/helpconnection/Connection</url-pattern>
  </servlet-mapping>
  ...

我也忍不住用未弃用的 ClickListener 替换已弃用的 ClickListener。

于 2013-11-04T09:49:42.227 回答
0

您手动设置是否有原因ServiceDefTarget?如果没有,您可以为您的onModuleLoad()方法尝试此代码吗?

@SuppressWarnings("deprecation")
public void onModuleLoad() {
    RootPanel rootPanel = RootPanel.get();
    Button btnNewButton = new Button("New button");
    HelpConnectionAsync Abra =(HelpConnectionAsync) GWT.create(HelpConnection.class);

    btnNewButton.addClickListener(new ClickListener() {
        public void onClick(Widget event) {

            Abra.sensors(new AsyncCallback<String[]>(){

                public void onSuccess (String[] result){
                    if (result == null) {
                        Hi.setText("Result was null!");
                        return;
                    }
                    textbox2.setText(result[0]);
                    Hi.setText("You Pass!");
                }
                public void onFailure(Throwable caught) {
                    caught.printStackTrace();
                    Hi.setText("You fail!");

                }
            });
        }
    });

    rootPanel.add(btnNewButton, 23, 30);
    rootPanel.add(textbox2,23, 70);     
    rootPanel.add(Hi, 23, 130);
}

另外,在您的服务器方法中,在您的catch块中,您可以捕获 aException而不是 aSQLException吗?我怀疑有什么东西逃跑了。

于 2013-11-03T19:48:34.603 回答