NullPointerException Error when using RPC

2019-09-13 02:11发布

I'm now currently extracting out data from my database using rpc, but whenever I click the button it does generates a error and my onFailure command is being triggered always.

Below is my Code for the program.

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);
}

}

This consist of both my Async and Service program

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

This is my Server side Program

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;
}}

And lastly this is the code generated out by the console

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 on the Development Mode

[ERROR] Uncaught exception escaped

com.google.gwt.event.shared.UmbrellaException: Exception caught: Service implementation URL not specified at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:129) at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129) at com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116) at com.google.gwt.user.client.ui.Widget.onBrowserEvent(Widget.java:177) at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351) at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1307) 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.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) 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) Caused by: com.google.gwt.user.client.rpc.ServiceDefTarget$NoServiceEntryPointSpecifiedException: Service implementation URL not specified at com.google.gwt.user.client.rpc.impl.RemoteServiceProxy.doPrepareRequestBuilderImpl(RemoteServiceProxy.java:430) at com.google.gwt.user.client.rpc.impl.RemoteServiceProxy.doInvoke(RemoteServiceProxy.java:368) at com.google.gwt.user.client.rpc.impl.RemoteServiceProxy$ServiceHelper.finish(RemoteServiceProxy.java:74) at com.mycompany.project.client.HelpConnection_Proxy.sensors(HelpConnection_Proxy.java:30) at com.mycompany.project.client.PleaseWork$1.onClick(PleaseWork.java:30) at com.google.gwt.user.client.ui.ListenerWrapper$WrappedClickListener.onClick(ListenerWrapper.java:245) at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:56) at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:1) at com.google.gwt.event.shared.GwtEvent.dispatch(GwtEvent.java:1) at com.google.web.bindery.event.shared.EventBus.dispatchEvent(EventBus.java:40) at com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:193) at com.google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88) at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:127) at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129) at com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116) at com.google.gwt.user.client.ui.Widget.onBrowserEvent(Widget.java:177) at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351) at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1307) 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.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) 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)

Another attempt based on changing the return User to return String[] {"text1","text2"} There was this error genererated in the Developmentmode again,

[ERROR] Uncaught exception escaped

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String at com.mycompany.project.client.PleaseWork$1$1.onSuccess(PleaseWork.java:40) at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:232) 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.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) 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)

3条回答
贪生不怕死
2楼-- · 2019-09-13 02:45

Is there a reason you're manually setting the ServiceDefTarget? If not, can you try this code for your onModuleLoad() method?

@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);
}

also, in your server method, in your catch blocks, can you catch an Exception instead of a SQLException? I suspect something escapes.

查看更多
混吃等死
3楼-- · 2019-09-13 03:09

You have defined a method

public String[] sensors() throws Exception;

expecting a return value of String[].

In your call, you handle the return value as 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!");

    }
    };

In fact, it is not a String, it is a String[]. Change your code to:

        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!");

        }
        };

This will handle the return value correct as String[].

Next thing to improve is your server part:

First, if you catch an exception on the server side, you will not throw it to the client. In your case, you catch the SQLException and proceed as if everything is ok on the server. Adding a throw statement will tell the client, that something went wrong on the server.

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;
}}

If you don't find something on your DB, yow will return null. You have to check, if your return value is not null before setting the value to the widget.

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

I personally prefer using List in this case. Because, you can create the list without knowing, how many values you will return.

查看更多
疯言疯语
4楼-- · 2019-09-13 03:09

I removed the ServiceDefTarget from your PleaseWork class. It's just a base to work on, now you just have to add you database handling. Also i changed the type of the callback. It now works for me (I removed some code to reduce the amount of code ):

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);

        }
    });

In your original post there was no servlet mapping, so i added it :

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

And the asyn counterpart :

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

And the important part of the MySQLConnection :

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


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

Besides the Java classes, i used the following 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>
  ...

Also i could not resist to replace the deprecated ClickListener with the not deprecated one.

查看更多
登录 后发表回答