简体   繁体   English

在黑莓模拟器上运行Web服务时出错

[英]Error while running web service on blackberry simulator

I am trying to access a webservice from a BlackBerry application that I developed. 我正在尝试从我开发的BlackBerry应用程序访问Web服务。

However, when running the app I get 但是,当我运行应用程序时,我得到了

" App Error 104 Uncaught: NullPointerException " “App Error 104 Uncaught:NullPointerException”

I am unable to debug, for some strange reason my debugger auto-closes as soon as I start debugging. 我无法调试,因为一些奇怪的原因我的调试器在我开始调试时自动关闭。

Any suggestions on what could be the reason? 关于可能是什么原因的任何建议? I would like to mention that I have received the three .csi signature files from BlackBerry, but whenever I try to sign the application it fails: The Signature information in the code signing register request is not of appropriate length . 我想提一下,我已收到BlackBerry提供的三个.csi签名文件,但每当我尝试签署该应用程序时,它都会失败: 代码签名注册请求中的签名信息长度不合适 Could this error be due to signing the application? 这个错误可能是由于签署申请?

This is what I've done so far: 这是我到目前为止所做的:

package mypackage;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.rmi.RemoteException;
import java.util.Hashtable;

import javacard.framework.UserException;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.location.Location;
import javax.microedition.location.LocationProvider;

import org.kobjects.base64.Base64;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransport;
import org.xmlpull.v1.XmlPullParserException;

import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.component.pane.TitleView;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.image.Image;
import net.rim.device.api.xml.jaxp.SAXParserImpl;

public class LoginTest extends UiApplication 
{

    public static void main(String[] args)  
    {
         //Create a new instance of the app
         //and start the app on the event thread.

        LoginTest app = new LoginTest();
        app.enterEventDispatcher();
    }

    public LoginTest()
    {
         //Display a new screen.
         pushScreen(new LoginTestScreen());
    }

}

//Create a new screen that extends MainScreen and provides
//behaviour similar to that of other apps.

final class LoginTestScreen extends MainScreen
{
   //declare variables for later use
   private InfoScreen _infoScreen;
   private ObjectChoiceField choiceField;
   private int select;
   BasicEditField username;
   PasswordEditField passwd;
   CheckboxField checkBox1;
   ButtonField loginBtn;

   public LoginTestScreen()
   {
        //Invoke the MainScreen constructor.

        super();

        //Add a screen title.

        setTitle("Track24ELMS");

        LabelField login = new LabelField("ELMS Login", LabelField.FIELD_HCENTER); 
        login.setFont(Font.getDefault().derive(Font.BOLD, 30));
        login.setMargin(10, 0, 20, 0); //To leave some space from top and bottom

        HorizontalFieldManager user = new HorizontalFieldManager();
        user.setMargin(0, 0, 10, 0);
        HorizontalFieldManager pass = new HorizontalFieldManager();
        pass.setMargin(0, 0, 20, 0);
        HorizontalFieldManager checkbox = new HorizontalFieldManager();
        checkbox.setMargin(0, 0, 30, 0);
        HorizontalFieldManager btns = new HorizontalFieldManager(HorizontalFieldManager.FIELD_HCENTER);

        LabelField usernameTxt = new LabelField("Username :");
        LabelField passwordTxt = new LabelField("Password :");

        username = new BasicEditField();
        passwd = new PasswordEditField();

        loginBtn = new ButtonField("Login", ButtonField.CONSUME_CLICK); 
        loginBtn.setChangeListener(new LoginButtonListener());

        checkBox1 = new CheckboxField("Remember me",false);

        user.add(usernameTxt);
        user.add(username);
        pass.add(passwordTxt);
        pass.add(passwd);
        //checkbox.add(checkBox1);
        btns.add(loginBtn);
        add(login);
        add(user);
        add(pass);
        add(checkBox1);
        add(btns);
   }

   private class LoginButtonListener implements FieldChangeListener {
       public void fieldChanged(Field field, int context) {
       //Open a new screen
       String uname = username.getText();
       String pwd = passwd.getText();

       //If there is no input
       if (uname.length() == 0 || pwd.length()==0)
       Dialog.alert("One of the textfield is empty!");
       else 
       {
           final String URL = "http://xxx.xxx.com/xxx/xxx.asmx";
           final String METHOD_NAME = "ValidateCredentials";
           final String NAMESPACE = "http://tempuri.org/";
           final String SOAP_ACTION = NAMESPACE+METHOD_NAME;
           //final String URL = "http://prerel.track24elms.com/Android/T24AndroidLogin.asmx/ValidateCredentials";

           SoapObject resultRequestSOAP = null;
           HttpConnection httpConn = null;
           HttpTransport httpt;
           System.out.println("The username" + uname + "password" + pwd );
           SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
           request.addProperty("Username", "abc");//First parameter is tag name provided by web service
           request.addProperty("Password", "xyz");
           System.out.println("The request is=======" + request.toString());
           SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
           envelope.bodyOut = request;
           envelope.dotNet = true;
           envelope.encodingStyle = SoapSerializationEnvelope.XSD;
           envelope.setOutputSoapObject(request);
           System.out.println("The envelope has the value++++"+ envelope.toString());

           /* URL+  Here you can add paramter so that you can run on device,simulator etc. this will work only for wifi */
           httpt = new HttpTransport(URL+ ";deviceside=true;ConnectionUID=S TCP-WiFi");
           httpt.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
           httpt.debug = true;
           try
           {
               System.out.println("SOAP_ACTION    ==   " + SOAP_ACTION);
               httpt.call(SOAP_ACTION, envelope);
               System.out.println("the tranport" + httpt.toString());
               resultRequestSOAP = (SoapObject) envelope.bodyIn;
               System.out.println("result    ==   " + resultRequestSOAP);            
           }
           catch (IOException e) {
               // TODO Auto-generated catch block
               System.out.println("The exception is IO==" + e.getMessage());
           } catch (XmlPullParserException e) {

               // TODO Auto-generated catch block
               System.out.println("The exception xml parser example==="
                       + e.getMessage());
           }
           System.out.println( resultRequestSOAP);
           if(resultRequestSOAP.equals("credentialaccepted"))
           {
           UiApplication.getUiApplication().pushScreen(new InfoScreen()); //Open a new Screen
           }
           else
           {
               System.out.println("Login details not valid");
           }
         }
      }

   };

   //To display a dialog box when a BlackBerry device user
   //closes the app, override the onClose() method.

   public boolean onClose()
   {
        Dialog.alert("Goodbye!");
        System.exit(0);
        return true;
   }

   //Create a menu item for BlackBerry device users to click to see more 
   //information about the city they select.

   private MenuItem _viewItem = new MenuItem("More Info", 110, 10) 
   {
        public void run() 
        {
             //Store the index of the city the BlackBerry device user selects

             select = choiceField.getSelectedIndex();

             //Display a new screen with information about the
             //city the BlackBerry device user selects

             _infoScreen = new InfoScreen();
             UiApplication.getUiApplication().pushScreen(_infoScreen);
        }
   };

   //Create a menu item for BlackBerry device users to click to close 
   //the app.

   private MenuItem _closeItem = new MenuItem("Close", 200000, 10) 
   {
        public void run()
        {
             onClose();
        }
   };


   //Create an inner class for a new screen that displays
   //information about the city a BlackBerry device user selects.

   private class InfoScreen extends MainScreen
   {
        public InfoScreen() 
        {
             super();

             setTitle("Itinerary");


             LabelField login = new LabelField("Employee Itinerary", LabelField.FIELD_HCENTER); 

             Bitmap bitmap = Bitmap.getBitmapResource("img1.jpg");
             EditField statusMsg = new EditField("Status Message", "Update status here");

        }
   }
}

Code Signing 代码签名

As Th0rndike said, you don't need to sign code to run in the simulator, so that's not your problem (in the simulator). 正如Th0rndike所说,你不需要在模拟器中签署代码来运行,所以这不是你的问题(在模拟器中)。

Getting the Debugger Working Again 让调试器再次工作

Also, if you're having trouble even setting breakpoints or stepping through your own Java source code, then: 此外,如果您在设置断点或单步执行自己的Java源代码时遇到问题,那么:

  1. Inside the simulator, delete the application as you would on a normal device. 在模拟器内部,像在普通设备上一样删除应用程序。
  2. Restart the simulator. 重启模拟器。
  3. Try running from Eclipse again. 尝试再次从Eclipse运行。 If it still doesn't work: 如果它仍然不起作用:
  4. Inside Eclipse, from the BlackBerry menu, choose Clean Simulator and then the JRE package whose simulator you're using (eg 5.0.0, 6.0.0, etc.) 在Eclipse中,从BlackBerry菜单中选择Clean Simulator ,然后选择您正在使用其模拟器的JRE包(例如5.0.0,6.0.0等)
  5. Try running from Eclipse again. 尝试再次从Eclipse运行。 If it still doesn't work: 如果它仍然不起作用:
  6. I would try reinstalling Eclipse and the BlackBerry Java plugin ( together ... rather than installing a non-BlackBerry Eclipse IDE, and then adding the BlackBerry plugin separately). 我会尝试重新安装Eclipse和BlackBerry Java插件( 一起 ......而不是安装非BlackBerry Eclipse IDE,然后单独添加BlackBerry插件)。 You can download the full Eclipse + BlackBerry plugin from this site . 您可以从此站点下载完整的Eclipse + BlackBerry插件。

Keep in mind that you will not be able to step into Java code that's part of the Java runtime, and RIM libraries. 请记住,您将无法 进入 Java运行时和RIM库的Java代码。 You do not have the Java source for those, only the binary libraries. 您没有Java 源代码 ,只有二进制库。 So, if you have the line of code: 所以,如果你有代码行:

String s1 = "afdafsdasdf";
String substring = s1.substring(0, 10);  // <- can not step IN, can step OVER
MyWidget mw = new MyWidget();
mw.foo();                                // <- can step IN, or OVER

you would not be able to step into the second line, because substring(int,int) is not your code. 你将无法进入第二行,因为substring(int,int)不是你的代码。 But, you should be able to step into mw.foo() without seeing the "Source Not Found" errors, assuming MyWidget.java is one of your Java source files. 但是,假设MyWidget.java是您的Java源文件之一,您应该能够进入mw.foo()而不会看到“Source Not Found”错误。

Finding Where Exceptions are Thrown 查找异常被抛出的位置

If you're running, and having trouble finding out where an uncaught NullPointerException (or other exception) is being thrown, see this answer . 如果您正在运行,并且无法找到抛出未捕获的NullPointerException (或其他异常)的位置, 请参阅此答案 Basically, just put this debug code in your main program (eg MyApp.java): 基本上,只需将此调试代码放在主程序中(例如MyApp.java):

public static void main(String[] args)
{
    try {
        Application theApp = new MyApp();
        theApp.enterEventDispatcher();
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

And then, after the Throwable is caught, check the Eclipse Console window for stack trace information, showing where the exception came from. 然后,在捕获Throwable之后,检查Eclipse Console窗口中的堆栈跟踪信息,显示异常的来源。 Then, debug again, trying to step into that code, and see what's wrong. 然后,再次调试,尝试进入该代码,看看有什么问题。

But, getting a functioning debugger is an absolute requirement for productive development. 但是,获得一个正常运行的调试器是生产开发的绝对要求。 Don't bother with other problems until debugging works for you. 在调试为您工作之前,请不要理会其他问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM