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??
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
Curtir tópico
+ 0
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?
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)