POST Retrofit con Lista

233 views
Skip to first unread message

edgar macas

unread,
Oct 29, 2016, 8:11:36 PM10/29/16
to desarrolladores-android
Saludos espero me puedan ayudar, tengo una lista de Objetos por ejemplo List<Personas> ahora lo que deseo es enviarlo con RETROFIT mediante un POST, lo he logrado hacer son un solo objeto pero con una lista no he encontrado la forma, gracias este es lo que tengo en el codigo  

@POST("personas")
Call<Persona> subirPersona(@Body List<Persona> personas);

Call<Persona> p = servicio.subirPersona(listaPersonas);
p.enqueue(new Callback<Persona>() {
@Override
public void onResponse(Call<Persona> call, Response<Persona> response) {
if(response.isSuccessful()){
Log.e("successful","SUBIO");
}else{
Log.e("nosuccessful", String.valueOf(response.body()));
Log.e("nosuccessful", String.valueOf(response.body()));
}
}

@Override
public void onFailure(Call<Persona> call, Throwable t) {
Log.e("fallo", t.getMessage());
}

Gabriel Pozo

unread,
Oct 30, 2016, 12:11:36 PM10/30/16
to desarrolladores-android
La verdad que no eh usado esa librería, y estoy desde mi celu, es medio incomodo leer la documentación, así que no lo eh hecho :D
Pero no debería ser algo así?

@POST("personas")
Call<List<Persona>> subirPersona(@Body List<Persona> personas);
Call<List<Persona>> p = servicio.subirPersona(listaPersonas);
p.enqueue(new Callback<List<Persona>>() {
@Override
public void onResponse(Call<List<Persona>> call, Response<Persona> response) {
        // YO colocaría un logcat con toda la respuesta o un breackpoint aquí
        Log.d("onResponse", "Call: " + call.toString() + "  Response: " + response.toString());
        if(response.isSuccessful()){
Log.e("successful","SUBIO");
}else{
Log.e("nosuccessful", String.valueOf(response.body()));
Log.e("nosuccessful", String.valueOf(response.body()));
}
}

@Override
    public void onFailure(Call<List<Persona>> call, Throwable t) {
        // Y aquí
        Log.e("onFailure", "Call: " + call.toString());
        Log.e("fallo", t.getMessage());
}

Es solo algo que estoy suponiendo :D seguramente debe ser algo así, o creando un objeto que sea una lista de Personas, o que contenga una lista de personas. De todas maneras deberíamos ver algún error, warning, o mensaje en la salida del logcat ;)

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/4c8e1471-8b93-4251-af1d-a69b487706a4%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

edgar macas

unread,
Oct 30, 2016, 12:38:16 PM10/30/16
to desarrolladores-android
gracias por la sugerencia, de momento me manda directo al onFailure, y al mostrar el " Log.e("onFailure", "Call: " + call.toString());" unicamente  me muestra esto: 
/onFailure: Call: retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall@41effe98 que es algo incomprensible, al tratar de mostrar "Log.e("fallo", t.getMessage());"
me muestra una excepcion e que no encuentra un mensaje que mostrar, espero me ayuden con mas sugerencias
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.

Eduardo Martin Cabrera

unread,
Oct 30, 2016, 1:44:02 PM10/30/16
to desarrollad...@googlegroups.com
te recomiendo mirar ademas en el método printStackTrace() del throwable del onFailure, el getMessage apenas te da la descripcion para humanos y muy breve, en cambio el printStackTrace() es el que tiene los detalles al estilo salvaje del logcat jaja

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-android+unsubscr...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/4c8e1471-8b93-4251-af1d-a69b487706a4%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.

edgar macas

unread,
Oct 30, 2016, 2:01:13 PM10/30/16
to desarrolladores-android
De momento estoy tratando de subir una persona no una lista para probar que funcione primeramente esto, el inconveniente que veo es el siguiente:
me esta enviando todos los atributos de la persona como null, pero antes de eso presento la persona que voy a enviar y efectivamente tiene datos: este es el codigo:

Log.e("subir",listaPersonasSubir.get(2).toString());
E/subir: Persona{idPersona='1105040115', fechaCreacion=Mon Oct 24 04:40:02 GMT+08:00 2016, estado=true, apellidosNombres='MOROCHO KARINA', descripcionDni='1105040115', tipoTelefono=null, telefonoNumero='null', correoElectronico='null', idEstadoCivilFk=SOLTERO, idTipoDocumentoFk=CÉDULA DE IDENTIDAD, conyugeIdPersonaFk=null}

Call<Persona> persona = servicio.subirPersona(listaPersonasSubir.get(2));
persona.enqueue(new Callback<Persona>() {

@Override
public void onResponse(Call<Persona> call, Response<Persona> response) {
if(response.isSuccessful()){
            Log.e("entro", "issucceesul");
}else{
Log.e("entro", "no successful");
        }
}

@Override
public void onFailure(Call<Persona> call, Throwable t) {
        Log.e("entro", "fallo");
}
});


y este es el logcat que me devuelve al tratar de subir la persona:
draco.catastroyantzaza D/OkHttp: <-- 500 Internal Server Error http://192.168.5.106:8080/Catastro.WebService/persona/actualizar (101ms)
10-31 01:53:34.830 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Content-Language: 
10-31 01:53:34.830 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Content-Type: text/html
10-31 01:53:34.830 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Date: Sun, 30 Oct 2016 17:53:35 GMT
10-31 01:53:34.830 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Connection: close
10-31 01:53:34.830 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Content-Length: 3626
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>Payara Server  4.1.1.162 #badassfish - Error report</title><style type="text/css"><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - Internal Server Error</h1><hr/><p><b>type</b> Exception report</p><p><b>message</b>Internal Server Error</p><p><b>description</b>The server encountered an internal error that prevented it from fulfilling this request.</p><p><b>exception</b> <pre>javax.servlet.ServletException: javax.ejb.EJBException: Transaction aborted</pre></p><p><b>root cause</b> <pre>javax.ejb.EJBException: Transaction aborted</pre></p><p><b>root cause</b> <pre>javax.transaction.RollbackException: Transaction marked for rollback.</pre></p><p><b>root cause</b> <pre>javax.persistence.PersistenceException: Exception [EclipseLink-4002] &#40;Eclipse Persistence Services - 2.6.2.qualifier&#41;: org.eclipse.persistence.exceptions.DatabaseException
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Internal Exception: org.postgresql.util.PSQLException: ERROR: el valor null para la columna �id_persona� viola la restricci�n not null
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp:   Detail: La fila que falla contiene &#40;null, null, null, null, null, null, null, null, null, null, null, null&#41;.
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Error Code: 0
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Call: INSERT INTO persona &#40;id_persona, apellidos_nombres, correo_electronico, descripcion_dni, estado, fecha_creacion, fecha_modificacion, telefono_numero, tipo_telefono, conyuge_id_persona_fk, id_estado_civil_fk, id_tipo_documento_fk&#41; VALUES &#40;?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?&#41;
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: 	bind =&gt; [12 parameters bound]
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Query: InsertObjectQuery&#40;com.draco.catastro.entidad.Persona[ idPersona=null ]&#41;</pre></p><p><b>root cause</b> <pre>Exception [EclipseLink-4002] &#40;Eclipse Persistence Services - 2.6.2.qualifier&#41;: org.eclipse.persistence.exceptions.DatabaseException
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Internal Exception: org.postgresql.util.PSQLException: ERROR: el valor null para la columna �id_persona� viola la restricci�n not null
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp:   Detail: La fila que falla contiene &#40;null, null, null, null, null, null, null, null, null, null, null, null&#41;.
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Error Code: 0
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Call: INSERT INTO persona &#40;id_persona, apellidos_nombres, correo_electronico, descripcion_dni, estado, fecha_creacion, fecha_modificacion, telefono_numero, tipo_telefono, conyuge_id_persona_fk, id_estado_civil_fk, id_tipo_documento_fk&#41; VALUES &#40;?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?&#41;
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: 	bind =&gt; [12 parameters bound]
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: Query: InsertObjectQuery&#40;com.draco.catastro.entidad.Persona[ idPersona=null ]&#41;</pre></p><p><b>root cause</b> <pre>org.postgresql.util.PSQLException: ERROR: el valor null para la columna �id_persona� viola la restricci�n not null
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp:   Detail: La fila que falla contiene &#40;null, null, null, null, null, null, null, null, null, null, null, null&#41;.</pre></p><p><b>note</b> <u>The full stack traces of the exception and its root causes are available in the Payara Server  4.1.1.162 #badassfish logs.</u></p><hr/><h3>Payara Server  4.1.1.162 #badassfish</h3></body></html>
10-31 01:53:34.840 24213-25013/ec.com.draco.catastroyantzaza D/OkHttp: <-- END HTTP (3626-byte body)

Como se puede ver me dice que estoy enviando datos NULOS  pero antes de envair imprimo ese objeto y tiene datos, cual puede ser el problema y q estoy haciendo de mal, gracias

Eduardo Martin Cabrera

unread,
Oct 30, 2016, 2:06:31 PM10/30/16
to desarrollad...@googlegroups.com
como prueba intenta poniendo datos en todos los campos para que no quede ninguno en null, quizas sea porque la DB recibe alguno de estos en null

[EDITADO]
ponele atención al idPersona, por lo visto en la app tiene un valor pero el servidor no lo recibe (o recibe un null) tendrias seguirle el rastro a eso por empezar


--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

edgar macas

unread,
Oct 30, 2016, 2:16:57 PM10/30/16
to desarrollad...@googlegroups.com
he probado enviando un objeto vacio desde POSTMAN para probar y me arroja el mismo error que desde retrofit , al parecer  aqui me toma que que no envio nada:

Call<Persona> persona = servicio.subirPersona(listaPersonasSubir.get(2));

talvez qui deberia crear un nuevo objeto y asignarle el que esta en la lista??

El 30 de octubre de 2016, 13:06, Eduardo Martin Cabrera <emcsolu...@gmail.com> escribió:
como prueba intenta poniendo datos en todos los campos para que no quede ninguno en null, quizas sea porque la DB recibe alguno de estos en null
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-android+unsubscr...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/desarrolladores-android/AkXRYPTMsNI/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

edgar macas

unread,
Oct 30, 2016, 10:46:34 PM10/30/16
to desarrollad...@googlegroups.com
El problema en si es que estoy utilizando Realm como base de datos y al tratar de enviar un objeto RealmObject por retrofit pues no es compatible con la serializacion y siempre me envia un objeto vacio, la unica solicion que he encontrado es crear un nuevo objeto por ejemplo:
Persona nueva = new Persona
e ir asignado cada atributo que la lista que tenia planteado enviar a este nuevo objeto algo asi
nueva.setNombre(personaSubir.getNombre()); y asi con todos los atributos algo que lleva demaciado tiempo a alguien le ha pasado algo similar cual podria ser la mejor solucion gracias.


Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-android+unsubscr...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Eduardo Martin Cabrera

unread,
Oct 31, 2016, 12:11:33 AM10/31/16
to desarrollad...@googlegroups.com

Eduardo Martin Cabrera

unread,
Oct 31, 2016, 12:19:30 AM10/31/16
to desarrollad...@googlegroups.com
Claro ahi puede estar el problema, retrofit no tiene ni idea de que es realm, por lo que o bien convertis los datos a objetos mas simples como POJO, o bien usas algun converter (hacer un custom converter para realm: https://futurestud.io/tutorials/retrofit-replace-the-integrated-json-converter o mejor alguno ya existente para realm-retrofit: https://github.com/podisto/realm-retrofit)

edgar macas

unread,
Oct 31, 2016, 12:46:42 AM10/31/16
to desarrollad...@googlegroups.com
gracias por los link, pues antes he mirado varios de ellos, y lo que encontre es crerar un serializar personalizada para mi clase, el problema es que la clase es demaciada extenda y hacer todo eso es muy tedioso, creando un json para enviarlos por POSTMAN  lleva mas o menos unas 1500 lineas y crear un serializar para cada atributo es mucho trabajo, el ejemplo de github "https://github.com/podisto/realm-retrofit" es muy bueno pero no muestra en ejemplo son POST que es donde tengo el problema ya que al realizar un GET lo hace perfectamente.

Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

edgar macas

unread,
Oct 31, 2016, 9:08:21 AM10/31/16
to desarrollad...@googlegroups.com
Solucionado!!! la solucion fue utilizar Jackson en lugar de Gson, y creando el Retrofit de la siguiente manera:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build()

Con esto me crea un Json correctamente a partir del ResulList<Persona> que me devuelve la consulta a la base Realm.

Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a desarrolladores-android+unsubscr...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrolladores-android@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

edgar macas

unread,
Oct 31, 2016, 9:18:24 AM10/31/16
to desarrollad...@googlegroups.com
Gracias a todos por su tiempo y sugerencias
Reply all
Reply to author
Forward
0 new messages