Retrofit 2 - Erro ao inserir lista via post.

Android

17/02/2016

Migrei a pouco tempo para o Retrofit 2 e me depararei com o seguinte problema:
Ao tentar inserir, via post, uma lista de usuários convertidos para o formato Json, aparece a mensagem "Internal Server Error".
Obs. Estou usando um webservice em java. Tentei inserir o Json gerado via SoapUI e consegui com sucesso.

#Segue o código com os principais métodos da app android:

Dependências:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:okhttp:3.1.2'

}

public interface UsuarioAPI {

@FormUrlEncoded
@POST("usuario/inserirLista")
Call<Usuario> saveUsuarios(@Field("usuarios") String listaUsuariosJson);
}

public class MainActivity extends AppCompatActivity {

@Override
protected void onResume(){
super.onResume();

Gson gson = new GsonBuilder().registerTypeAdapter(Usuario.class, new UsuarioDeserializer()).create();

Retrofit retrofit = new Retrofit
.Builder()
.baseUrl(API)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
UsuarioAPI usuarioAPI = retrofit.create(UsuarioAPI.class);


// SAVE LISTA DE USUÁRIOS - REQUEST POST
ArrayList<Usuario> listUsuarios = new ArrayList<>();

Plano plano1 = new Plano();
plano1.setIdPlano(2);

Usuario usuario1 = new Usuario();
usuario1.setNmUsuario("Ricardo da Silva");
usuario1.setDsEmail("ricardo@bol.com.br");
usuario1.setFlAtivo(0);
usuario1.setPlano(plano1);
listUsuarios.add(usuario1);

Plano plano2 = new Plano();
plano2.setIdPlano(3);

Usuario usuario2 = new Usuario();
usuario2.setNmUsuario("José Alves Chaves");
usuario2.setDsEmail("alves@gmail.com.br");
usuario2.setFlAtivo(0);
usuario2.setPlano(plano2);
listUsuarios.add(usuario2);

Call<Usuario> call = usuarioAPI.saveUsuarios(new Gson().toJson( listUsuarios ));

call.enqueue(new Callback<Usuario>() {
@Override
public void onResponse(Call<Usuario> call, Response<Usuario> response) {
Log.i(TAG, "Sucesso" + response.raw().message());
}

@Override
public void onFailure(Call<Usuario> call, Throwable t) {
Log.i(TAG, "Error ao Salvar Usuário: " + t.getCause());
}
});
}

}

#Segue o código com o principal método do webservice:

@POST
@Path("/inserirLista")
@Produces("application/json; charset=UTF-8")
@Consumes("application/json")
public String inserirLista(String listaUsuariosJson) {

Gson gson = new Gson();
ArrayList<Usuario> listaUsuarios = new ArrayList<Usuario>();
JsonParser parser = new JsonParser();
JsonArray array = parser.parse(listaUsuariosJson).getAsJsonArray();

for (int i = 0; i < array.size(); i++) {
listaUsuarios.add(gson.fromJson(array.get(i), Usuario.class));
}
return new Controller().inserirLista(listaUsuarios);
}

Alguém poderia dar uma luz nesse problema??
Evandro Gomes

Evandro Gomes

Curtidas 0

Respostas

Evandro Gomes

Evandro Gomes

17/02/2016

Fala galera !!!
Consegui resolver o problema, mas surgiu outro. rs
Coloquei o annotation @Headers e passei a receber o json, via Post, no meu webservice java.

@Headers({
"Accept: application/json",
"Content-type: application/json;charset=UTF-8"
})
@POST("usuario/inserirLista")
@FormUrlEncoded
Call<Usuario> saveUsuarios(@Field("listaUsuariosJson") String listaUsuariosJson);

## O problema é que estou recebendo nesse formato:
listaUsuariosJson=%5B%7B%22dsEmail%22%3A%22ricardo%40bol.com.br%22%2C%22flAtivo%22%3A0%2C%22idUsuario%22%3A1%2C%22nmUsuario%22%3A%22Ricardo%20da%20Silva%22%2C%22plano%22%3A%7B%22idPlano%22%3A2%7D%7D%2C%7B%22dsEmail%22%3A%22alves%40gmail.com.br%22%2C%22flAtivo%22%3A0%2C%22nmUsuario%22%3A%22Jos%C3%A9%20Alves%20Chaves%22%2C%22plano%22%3A%7B%22idPlano%22%3A3%7D%7D%5D

## Json enviado:
[{"dsEmail":"ricardo@bol.com","flAtivo":0,"idUsuario":1,"nmUsuario":"Ricardo da Silva","plano":{"idPlano":2}},{"dsEmail":"alves@gmail.com.br","flAtivo":0,"nmUsuario":"Jos� Alves Chaves","plano":{"idPlano":3}}]

## Método do webservice que recebe a chamada:
@POST
@Path("/inserirLista")
@Produces("application/json; charset=UTF-8")
@Consumes("application/json; charset=UTF-8")
public String inserirLista(String listaUsuariosJson) {
logger.debug("1 "+ listaUsuariosJson);
}

O que posso fazer para resolver esse problema?
GOSTEI 0
POSTAR