Retrofit 2 - Erro ao inserir lista via post.

17/02/2016

0

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

Responder

Posts

20/02/2016

Evandro Gomes

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?
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar