在Android中的body()方法中,Retrofit返回null

时间:2016-08-30 04:09:34

标签: android tomcat android-studio retrofit retrofit2

我无法在这些代码行中找到语义错误的位置:

PuntoGpsRecorridoDTO puntoGpsRecorridoDto = new PuntoGpsRecorridoDTO();
puntoGpsRecorridoDto.setDescripcion(puntoGpsRecorrido.getDescripcion());
puntoGpsRecorridoDto.setIdRecorrido(37);            
puntoGpsRecorridoDto.setDemoraSeg(2);
puntoGpsRecorridoDto.setPrecisionMts(10); 
puntoGpsRecorridoDto.setEstado(puntoGpsRecorrido.getEstado());
puntoGpsRecorridoDto.setFechaHora(puntoGpsRecorrido.getFechaHora());
puntoGpsRecorridoDto.setIdDispositivo("943953977-OFICINA");
puntoGpsRecorridoDto.setLatitud(puntoGpsRecorrido.getLatitud());
puntoGpsRecorridoDto.setLongitud(puntoGpsRecorrido.getLongitud());
puntoGpsRecorridoDto.setPrecisionMts(puntoGpsRecorrido.getPrecisionMts());
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDateDeserializer()).create();
Retrofit retrofit = new Retrofit.Builder().baseUrl(Util.URL_WS).addConverterFactory(GsonConverterFactory.create(gson)).build();
LocationService locationService = retrofit.create(LocationService.class);
Call<EstadoDTO> callEstadoDto = locationService.enviarPuntoGpsRecorrido(puntoGpsRecorridoDto);
Response<EstadoDTO> exec = callEstadoDto.execute();
estadoDto = exec.body(); // <<<------ body() return NULL  

改造客户的LocationService接口:

public interface LocationService
{
    @POST("recorrido/sending")
    Call<EstadoDTO> enviarPuntoGpsRecorrido(@Body PuntoGpsRecorridoDTO puntoGpsRecorridoDto);
}

连接服务? ---&GT; YES,

它以另一种方式运作? - &GT;是的,使用SoapUI测试,

服务器? ---&GT; Apache tomcat + Mysql + Hibernate

PuntoGpsRecorridoDTO类:

public class PuntoGpsRecorridoDTO 
{
    private Integer idRecorrido;
    private String idDispositivo;
    private Double latitud;
    private Double longitud;
    private Boolean estado;
    private String descripcion;
    private Integer precisionMts;
    private Integer demoraSeg;
    private Date fechaHora;

    public PuntoGpsRecorridoDTO()
    {
    } 
}

PuntoGpsRecorrido类:

@DatabaseTable(tableName = "PuntoGpsRecorrido")
public class PuntoGpsRecorrido
{
    @DatabaseField(generatedId = true)
    private Integer idRecorrido;

    @DatabaseField(foreign = true, canBeNull = false)
    private Dispositivo dispositivo;
    @DatabaseField
    private Double latitud;
    @DatabaseField
    private Double longitud;
    @DatabaseField
    private Boolean estado;
    @DatabaseField
    private String descripcion;
    @DatabaseField
    private Integer precisionMts;
    @DatabaseField
    private Integer demoraSeg;
    @DatabaseField
    private Date fechaHora;

    public PuntoGpsRecorrido()
    {}
}

EstadoDTO课程:

public class EstadoDTO
{
    public static final String EXITO="001";
    public static final String ERROR="000";

    private String code;
    private String msg;
    private String extra;

    public EstadoDTO()
    {}

}

错误:

enter image description here

使用SoapUI进行测试,结果非常好:

enter image description here

  

我做错了什么?如果您有更多信息,请告诉我   信息需要。提前谢谢。

2 个答案:

答案 0 :(得分:0)

使用以下代码,它将处理来自服务器的各种故障,您可能需要升级到最新版本的Retrofit。

致电callEstadoDto = locationService.enviarPuntoGpsRecorrido(puntoGpsRecorridoDto);

            callEstadoDto.enqueue(new Callback<EstadoDTO>() {
                @Override
                public void onResponse(Response<EstadoDTO> response, Retrofit retrofit) {
                    hideLoader();
                    if(response.isSuccess()){

                      //do your thing

                    }else{

                        String error=response.errorBody().string();
                    }
                }

                @Override
                public void onFailure(Throwable t) {


                    Log.e("error " , ""+t.toString());
                }
            });

答案 1 :(得分:0)

这是解决方案!

  1. 检测到错误:属性中的序列化日期数据类型错误 对象PuntoGpsRecorridoDTO发送POJO Web服务。

    Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDateDeserializer()).create();

  2. 解决方案:替换为:

    Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDateSerializer()).create();
    

    Aqui las clases:

    JsonDateDeserializer类:

    public class JsonDateDeserializer implements JsonDeserializer<Date>
    {
        @Override
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
        {
            String s = json.getAsJsonPrimitive().getAsString();
            long l = Long.parseLong(s); //long l = Long.parseLong(s.substring(6, s.length() - 2));
            Date d = new Date(l);
            return d;
        }
    }
    

    JsonDateSerializer类:

    public class JsonDateSerializer implements JsonSerializer<Date>
    {
        @Override
        public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context)
        {
            long l = src.getTime();
            JsonElement json = new JsonPrimitive(l);
            return json;
        }
    }
    

    快乐的节目......