ошибка android soapfault

Я новичок в Android, здесь у меня есть активность, использующая веб-сервис:

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);        
    GetBoundData val = new GetBoundData() {
    };
    PropertyInfo pi = new PropertyInfo();
    pi.setName("GetBoundData");
    pi.setValue(val);
    pi.setType(GetBoundData.class);
    request.addProperty(pi);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);
    Marshal floatMarshal = new MarshalFloat();

    envelope.addMapping(NAMESPACE, GetBoundData.class.getSimpleName(), GetBoundData.class);
    floatMarshal.register(envelope);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    androidHttpTransport.debug =true;
    TextView t = (TextView)this.findViewById(R.id.resultbox);

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    try {

        androidHttpTransport.call(SOAP_ACTION, envelope);
        System.out.println("aht requestDump is :"+androidHttpTransport.requestDump);
        System.out.println("aht responseDump is :"+androidHttpTransport.responseDump);
    } catch (Exception e) {
        e.printStackTrace(); 
    }
    try {

        Object result = (Object) envelope.bodyIn;
        String s = result.toString();
        t.setText(s);
    } catch (ClassCastException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        t.setText("1");
    }

и в классе GetBoundData:

public abstract class GetBoundData implements KvmSerializable {

String Bound = "((-0.00021792948245596397, -0.0002648681402206421), (0.00021792948246868618, 0.0002648681402206421))";
String Zoom ="21";
public Object getProperty(int arg0) {
switch (arg0){
    case 0:
        return Bound;
    case 1:
        return Zoom;
    default:
        return null;
        }
}

public int getPropertyCount() {
    return 2;//because you have 2 parameters
}

public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch(arg0)
{

    case 0:
        arg2.type = PropertyInfo.STRING_CLASS;
        arg2.name = "Bound";
        break;
    case 1:
        arg2.type = PropertyInfo.STRING_CLASS;
        arg2.name = "Zoom";
        break;
    default:break;
}

}
public void setval(String bound, String zoom) {
            Bound =  bound;
            Zoom =  zoom;           

    }
public void setProperty(int arg0, Object arg1) {
switch(arg0)
{
    case 0:
        Bound =  (String)arg1;
        break;
    case 1:
        Zoom =  (String)arg1;           
        break;
    default:
        break;
}

} }

и это веб-сервис xml

<wsdl:types>
 <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
  <s:element name="GetBoundData">
   <s:complexType>
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="Bound" type="s:string"/>
      <s:element minOccurs="0" maxOccurs="1" name="Zoom" type="s:string"/>
    </s:sequence>
   </s:complexType>
  </s:element>
  <s:element name="GetBoundDataResponse">
   <s:complexType>
     <s:sequence>
       <s:element minOccurs="0" maxOccurs="1" name="GetBoundDataResult"       type="tns:ArrayOfAnyType"/>
     </s:sequence>
   </s:complexType>
  </s:element>
  <s:complexType name="ArrayOfAnyType">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="unbounded" name="anyType" nillable="true"/>
    </s:sequence>
  </s:complexType>
 </s:schema>
</wsdl:types>

здесь образец веб-сервиса:

запрос:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
 <GetBoundData xmlns="http://tempuri.org/">
   <Bound>string</Bound>
   <Zoom>string</Zoom>
 </GetBoundData>
</soap:Body>
</soap:Envelope>

отклик:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
 <soap:Body>
  <GetBoundDataResponse xmlns="http://tempuri.org/">
    <GetBoundDataResult>
      <anyType />
      <anyType />
    </GetBoundDataResult>
  </GetBoundDataResponse>
 </soap:Body>
</soap:Envelope>

но покажи это:

SoapFault - faultcode: 'soap:Server'
faultstring: 'Server was unable to process request. ---> Object reference not set to an
instance of an object.' faultactor: 'null' detail: org.kxml2.kdom.Node@44efb360

Я использовал soapobject с getresponse(), но произошла ошибка


person Hamhame    schedule 23.01.2012    source источник
comment
Зарегистрируйте исключения с помощью Log.e(..) и опубликуйте дамп LogCat.   -  person Rajdeep Dua    schedule 23.01.2012
comment
Я добавляю это :catch(Исключение исключения){ Log.e(TAG,Получено исключение,исключение); } , но он не ловит никаких исключений   -  person Hamhame    schedule 23.01.2012


Ответы (2)


Это потому, что у вас сложный тип (например, объекты), и вы просто добавляете свойство «Простой тип».
проверьте мой ответ здесь я подробно объяснил, что нужно сделать.
Вам также нужно будет создать локальные классы, которые соответствуют сложному типу, эти локальные классы должны реализовывать kvmserializable, для пример:

<s:element name="GetBoundData">
 <s:complexType>
  <s:sequence>
  <s:element minOccurs="0" maxOccurs="1" name="Bound" type="s:string"/>
  <s:element minOccurs="0" maxOccurs="1" name="Zoom" type="s:string"/>
 </s:sequence>
</s:complexType>

означает, что в веб-службе существует класс с именем «GetBoundData». Итак, поскольку с помощью ksoap2 вы вручную создаете мыльную оболочку, вам придется создать такой класс в своем приложении, реализовав kvmserializable (который является интерфейсом сериализации ksoap2):

public class GetBoundData implements KvmSerializable {

    String Bound; 
    String Zoom;

    @Override
    public Object getProperty(int arg0) {
    switch (arg0){
        case 0:
            return Bound;
        case 1:
            return Zoom;
        default:
            return null;
            }
    }

    @Override
    public int getPropertyCount() {
        return 2;//because you have 2 parameters
    }

    @Override
    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
    switch(arg0)
    {

        case 0:
            arg2.type = PropertyInfo.STRING_CLASS;
            arg2.name = "Bound";
            break;
        case 1:
            arg2.type = PropertyInfo.STRING_CLASS;
            arg2.name = "Zoom";
            break;
        default:break;
    }

    }

    @Override
    public void setProperty(int arg0, Object arg1) {
    switch(arg0)
    {
        case 0:
            Bound =  (String)arg1;
            break;
        case 1:
            Zoom =  (String)arg1;           
            break;
        default:
            break;
    }
}

Вот как вы строите локальное соответствие для классов (объект, т.е. сложный тип) на сервере). Затем вам нужно добавить необходимые свойства, построить оболочку, добавить Mapping and Marshalling и отправить запрос. Все эти шаги объясняются в ссылке, которую я упомянул выше.

ОБНОВЛЕНИЕ Я объясню вам, что это такое:

<wsdl:message name="GetBoundDataSoapIn"> 
<wsdl:part name="parameters" element="tns:GetBoundData"/> 
</wsdl:message> 

Когда это wsdl:message, это означает, что это функция, необходимая для веб-службы. он имеет , что означает, что ему требуется параметр типа GetBoundData, который не является примитивным типом, на самом деле это сложный тип (объект).
Итак, вот шаги:
1- вам нужно написать локальное представление, т.е. класс, сложного типа GetBoundData (я уже написал это выше)
2- в вашем приложении вы должны создать ( это зависит от вас, где) функция, которая будет вызывать функцию, связанную с «GetBoundDataSoapIn» в веб-службе. Так что неплохо было бы создать функцию с значимым именем, т.е. что-то вроде:

 public GetBoundData getBoundData()
 {
  try
    {
        SoapObject sobj = new SoapObject(YOUR_NAMESPACE,THE_METHOD_NAME);


        //------------------------------------------------------------------------------
        //  GetBoundData :adding property
        //          <wsdl:message name="GetBoundDataSoapIn"> 
        //          <wsdl:part name="parameters" element="tns:GetBoundData"/> 
        //          </wsdl:message> 
        //  GetBoundData has two params:
        //      <s:element minOccurs="0" maxOccurs="1" name="Bound" type="s:string"/>
        //      <s:element minOccurs="0" maxOccurs="1" name="Zoom" type="s:string"/>
        //
        //--------------------------------------------------------------------------

        //--------------
        //  GetBoundData
        //--------------
        PropertyInfo pi = new PropertyInfo();
        pi.setName("GetBoundData");
        pi.setValue(Whatever_value_your_supposed_to_put);// these values are "Bound" And "Zoom" , they're supposed to be gotten in your app somewhere
        pi.setType(GetBoundData.class);
        sobj.addProperty(pi);

        //------------------------------
        //  START BUILDING SOAP ENVELOPE
        //------------------------------
        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        soapEnvelope.setOutputSoapObject(sobj);


        //---------------------------------------------------------------------------------------
        //      MAPPINGS:   
        //---------------------------------------------------------------------------------------

        soapEnvelope.addMapping(YOUR_NAMESPACE, GetBoundData.class.getSimpleName(), GetBoundData.class);

        //---------------------------------------------------------------------------------------
        //      MARSHALLING: 
        //---------------------------------------------------------------------------------------

        Marshal floatMarshal = new MarshalFloat();
        floatMarshal.register(soapEnvelope);


        AndroidHttpTransport aht = new AndroidHttpTransport(YOUR_URL); 


        aht.debug = true;

        try 
        {

            aht.call(YOUR_ACTION, soapEnvelope);

            //Importat Outputs to check how the request/Response looks like.. Check Logcat to find these outputs
            System.out.println("aht requestDump is :"+aht.requestDump);
            System.out.println("aht responseDump is :"+aht.responseDump);


            return soapEnvelope.getResponse();

        } 
        catch (Exception e) 
        {

            e.printStackTrace();
            return "Exception: " + e.getMessage()+"  message IS :" +e.getMessage()+"  localizedmessage is :"+e.getLocalizedMessage();
        }
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
        return "Exception: " + ex.getMessage();
    }
    }
}

Итак, проверьте logCat, чтобы увидеть форму запроса и ответа, и вы увидите, нужно ли вам получить ответ и проанализировать его, чтобы использовать его, я не уверен, каким будет ваш ответ, но в моем случае это был многомерный массив , поэтому мне пришлось разобрать его с помощью функций Java.
как для:

<wsdl:message name="GetBoundDataSoapOut"> 
<wsdl:part name="parameters" element="tns:GetBoundDataResponse"/> 
</wsdl:message> 

это просто говорит вам, что веб-служба отправляет ответ.

person ccot    schedule 28.01.2012
comment
спасибо за ваш ответ, но я не понял, что я должен написать в функции GetBoundData() - person Hamhame; 28.01.2012
comment
Вам не нужно, я имел в виду конструктор на случай, если вам нужно инициализировать некоторые вещи в нем. Если нет, то просто забудьте об этом. Обязательна только функция с тегами @Override - person ccot; 29.01.2012
comment
Я повторно редактирую пост и удаляю код конструктора. Если у вас есть другие вопросы, дайте мне знать - person ccot; 29.01.2012
comment
Я действительно благодарю вас за ответ, но не могли бы вы рассказать мне, как мне добавить свойство в soapobject в моем случае, у меня есть две части GetBoundData и GetBoundDataresult? :GetBoundData/› ‹/wsdl:message› ‹wsdl:имя сообщения=GetBoundDataSoapOut› ‹wsdl:имя части=параметры element=tns:GetBoundDataResponse/› ‹/wsdl:message› - person Hamhame; 29.01.2012
comment
Я делаю это, но все равно возникает та же ошибка с мылом, пожалуйста, проверьте мой обновленный вопрос, спасибо, что уделили этому вопросу свое внимание. - person Hamhame; 30.01.2012
comment
Строка Bbound и staticZoom является статической. - person Hamhame; 30.01.2012
comment
@Hamhame, вы можете скопировать/вставить вывод запроса/ответа, который вы получаете из :System.out.println(aht requestDump is :+androidHttpTransport.requestDump); System.out.println (aht responseDump: + androidHttpTransport.responseDump); - person ccot; 30.01.2012
comment
@Hamhame ошибка, которую вы получаете, скорее всего, связана с неправильным значением, которое вы передаете, вы уверены, что String Bound должен быть в этом формате? Есть ли немобильная версия вашего приложения, которая вызывает тот же веб-сервис? если да, попробуйте отправить запрос оттуда и проверьте его с помощью soapUI (sourceforge.net/projects/soapui) и посмотрите, в каком формате должны быть входные данные. - person ccot; 30.01.2012
comment
я получаю это: aht requestDump: v: Envelope xmlns: i=w3.org/2001/ Экземпляр XMLSchema xmlns:d=w3.org/2001/XMLSchema xmlns: c=schemas.xmlsoap.org/soap/encoding xmlns:v=schemas.xmlsoap.org/soap/envelope/›‹v:Header /›‹ v:Body›‹n0:GetBoundData id=o0 c:root=1 xmlns:n0=tempuri.org/›‹ GetBoundData i:type=d:anyType›‹Bound i:type=d:string›((-0,00021792948245596397, -0,0002648681402206421), (0,00021792948246868618, 0,0002648:681402206421))‹ string›21‹/Zoom›‹/GetBoundData›‹/n0:GetBoundData›‹/v:Body›‹/v:Envelope› - person Hamhame; 31.01.2012
comment
aht responseDump: ‹?xml version=1.0 encoding=utf-8?›‹soap:Envelope xmlns:soap=schemas.xmlsoap.org/soap/envelope xmlns:xsi=w3.org /2001/XMLSchema-instance xmlns:xsd=w3.org/2001/ не смог обработать запрос. --- Ссылка на объект не указывает на экземпляр объекта.‹/faultstring›‹detail /›‹/soap:Fault›‹/soap:Body›‹/soap:Envelope› - person Hamhame; 31.01.2012
comment
@Hamhame Хорошо, теперь запрос точен, поэтому код, который вы добавляете, хорош. Тогда проблема на стороне сервера, так как мыльный конверт запроса точен. Вы можете попробовать скопировать этот запрос мыла в soapUI и попробовать и посмотреть, что произойдет. если вы получаете ту же ошибку, вам следует обратиться к администратору сервера, чтобы узнать, в чем проблема. - person ccot; 31.01.2012
comment
@shadesco Не могли бы вы прочитать мой вопрос о WFS и ksoap2-андроид? - person JJD; 12.02.2012


Проверьте пространство имен, имя метода. По моему опыту, мы получаем эту ошибку, когда не установлено правильное соединение с веб-службой.

person Code_Life    schedule 23.01.2012