java.lang.IllegalArgumentException: is == null при попытке вставить в веб-службу ksoap2 - PullRequest
0 голосов
/ 29 октября 2019

У меня есть метод, который должен отправить объект типа «Solicitud» в веб-сервис, проблема в том, что когда я пытаюсь отправить объект в сеть, что-то получает нулевое значение. Это моя трассировка стека исключений:

W/System.err: java.lang.IllegalArgumentException: is == null
W/System.err:     at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1636)
        at org.ksoap2.transport.Transport.parseResponse(Transport.java:128)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.parseResponse(HttpTransportSE.java:301)
        at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:274)
        at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:118)
W/System.err:     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:113)
W/System.err:     at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity.insertSOAP(ServiciosActivity.java:202)
        at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity.armarSolicitud(ServiciosActivity.java:174)
W/System.err:     at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity.access$300(ServiciosActivity.java:59)
        at com.sfr.sfrmovil.Activities.ServiciosPublicos.ServiciosActivity$7.onClick(ServiciosActivity.java:327)
W/System.err:     at androidx.appcompat.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
        at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6702)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)
D/View: [Warning] assignParent to null: this = DecorView@4b62fd9[ServiciosActivity]
D/Surface: Surface::disconnect(this=0x74ae39a000,api=2)

Класс моей модели:

package com.sfr.sfrmovil.Activities.Modelo;

import androidx.annotation.Keep;

import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;

import java.util.Hashtable;

@Keep
public class Solicitud implements KvmSerializable {

    private static final String ID_SERVICIO = "idservicio";
    private static final String ID_FUENTE = "idfuente";
    private static final String ID_NOMBRES = "nombres";
    private static final String TELEFONO = "telefono";
    private static final String EMAIL = "email";
    private static final String DETALLE = "detalle";
    private static final String LATITUD = "latitud";
    private static final String LONGITUD = "longitud";
    private static final String IMAGEN = "imagen";
    private int idservicio;
    private int idfuente;
    private String nombres;
    private String telefono;
    private String email;
    private String detalle;
    private float latitud;
    private float longitud;
    private byte[] imagen;

    public Solicitud() {
    }

    public Solicitud(int idservicio, int idfuente, String nombres, String telefono, String email, String detalle, float latitud, float longitud, byte [] imagen) {
        this.idservicio = idservicio;
        this.idfuente = idfuente;
        this.nombres = nombres;
        this.telefono = telefono;
        this.email = email;
        this.detalle = detalle;
        this.latitud = latitud;
        this.longitud = longitud;
        this.imagen = imagen;
    }

    public int getIdservicio() {
        return idservicio;
    }

    public void setIdservicio(int idservicio) {
        this.idservicio = idservicio;
    }

    public int getIdfuente() {
        return idfuente;
    }

    public void setIdfuente(int idfuente) {
        this.idfuente = idfuente;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getDetalle() {
        return detalle;
    }

    public void setDetalle(String detalle) {
        this.detalle = detalle;
    }

    public float getLatitud() {
        return latitud;
    }

    public void setLatitud(float latitud) {
        this.latitud = latitud;
    }

    public float getLongitud() {
        return longitud;
    }

    public void setLongitud(float longitud) {
        this.longitud = longitud;
    }

    public byte[] getImagen() {
        return imagen;
    }

    public void setImagen(byte[] imagen) {
        this.imagen = imagen;
    }

    @Override
    public Object getProperty(int i) {

        switch (i) {
            case 0:
                return idservicio;
            case 1:
                return idfuente;
            case 2:
                return nombres;
            case 3:
                return telefono;
            case 4:
                return email;
            case 5:
                return detalle;
            case 6:
                return latitud;
            case 7:
                return longitud;
            case 8:
                return imagen;
            default:
                break;
        }
        return null;
    }

    @Override
    public int getPropertyCount() {
        return 9;
    }

    @Override
    public void setProperty(int i, Object o) {

        switch (i) {
            case 0:
                idservicio = Integer.parseInt(o.toString());
                break;
            case 1:
                idfuente = Integer.parseInt(o.toString());
                break;
            case 2:
                nombres = o.toString();
                break;
            case 3:
                telefono = o.toString();
                break;
            case 4:
                email = o.toString();
                break;
            case 5:
                detalle = o.toString();
                break;
            case 6:
                latitud = Float.parseFloat(o.toString());
                break;
            case 7:
                longitud = Float.parseFloat(o.toString());
                break;
            case 8:
                imagen = byte[].class.cast(o);
                break;

        }
    }

    @Override
    public void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) {

        switch (i){
            case 0:
                propertyInfo.name = ID_SERVICIO;
                propertyInfo.type = PropertyInfo.INTEGER_CLASS;
                break;
            case 1:
                propertyInfo.name = ID_FUENTE;
                propertyInfo.type = PropertyInfo.INTEGER_CLASS;
                break;
            case 2:
                propertyInfo.name = ID_NOMBRES;
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            case 3:
                propertyInfo.name = TELEFONO;
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            case 4:
                propertyInfo.name = EMAIL;
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            case 5:
                propertyInfo.name = DETALLE;
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            case 6:
                propertyInfo.name = LATITUD;
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            case 7:
                propertyInfo.name = LONGITUD;
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;
            case 8:
                propertyInfo.name = IMAGEN;
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                break;

        }
    }

    @Override
    public String getInnerText() {
        return null;
    }

    @Override
    public void setInnerText(String s) {

    }
}

Этот метод дает мне байт [] из изображения, полученного по телефону

public byte[] getBytesFromBitmap(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        return stream.toByteArray();
    }

Этот метод сборки объекта:

    private void assembleSolicitud() {
        String servicio = servicios_spnTipo.getSelectedItem().toString();
        final FirebaseUser user = firebaseAuth.getCurrentUser();
        String formatedNum = "(" + phoneNumber.substring(0, 3) + ")" + " " + phoneNumber.substring(3, 6) + "-" + phoneNumber.substring(6, 10);
        int idservicio = 0;
        if (servicio.equals("Alumbrado Publico")) {
            idservicio = 1;
        } else if (servicio.equals("Parques y Jardines")) {
            idservicio = 3;
        } else if (servicio.equals("Servicio de Limpia")) {
            idservicio = 2;
        }

        Solicitud solicitud = new Solicitud();

        solicitud.setIdservicio(idservicio);
        solicitud.setIdfuente(5);
        solicitud.setNombres(user.getDisplayName());
        solicitud.setTelefono(formatedNum);
        solicitud.setEmail(user.getEmail());
        solicitud.setDetalle(servicios_etDescrip.getText().toString());
        solicitud.setLatitud((float) latLngs[0]);
        solicitud.setLongitud((float) latLngs[1]);
        solicitud.setImagen(encodedImage);

        insertSOAP(solicitud);
    }

И этот метод является помощникомотправить мой объект "Solicitud" на wsdl

    private void insertSOAP(Solicitud solicitud) {

        try {
            SoapObject request = new SoapObject(NAMESPACE, METHOD_INSERT);

            request.addProperty("addSolicitud", solicitud);

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

            envelope.dotNet = true;
            envelope.implicitTypes = true;
            envelope.encodingStyle = SoapSerializationEnvelope.XSD;

            MarshalBase64 mb64 = new MarshalBase64();
            MarshalDouble md = new MarshalDouble();

            mb64.register(envelope);
            md.register(envelope);
            envelope.setOutputSoapObject(request);


            try {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);

                HttpTransportSE httpTransport = new HttpTransportSE(URL);

                httpTransport.call(SOAP_ACTION_INSERT, envelope);

                SoapObject result = (SoapObject) envelope.getResponse();


            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Это мой веб-сервис wsdl

<xsd:complexType name="addSolicitud">
<xsd:all>
<xsd:element name="idservicio" type="xsd:int"/>
<xsd:element name="idfuente" type="xsd:int"/>
<xsd:element name="nombres" type="xsd:string"/>
<xsd:element name="telefono" type="xsd:string"/>
<xsd:element name="email" type="xsd:email"/>
<xsd:element name="detalle" type="xsd:string"/>
<xsd:element name="latitud" type="xsd:float"/>
<xsd:element name="longitud" type="xsd:float"/>
<xsd:element name="imagen" type="xsd:base64Binary"/>
</xsd:all>
</xsd:complexType>

Это моя 202 строка вкод, это тот, который доставляет мне проблемы:

httpTransport.call(SOAP_ACTION_INSERT, envelope);

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

...