在 Android 中的 body() 方法中改造 return null

Retrofit return null in body() method in Android

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

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);
}

连接到服务? ---> 是的,

它通过另一种方式起作用? --> 是的,用 SoapUI 测试,

服务器? ---> Apache tomcat + Mysql + Hibernate

PuntoGpsRecorridoDTO class:

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 class:

@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 Class:

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()
    {}

}

错误:

用 SoapUI 测试,很顺利:

What am I doing wrong ? Please let me know if you for more information need. Thanks in advance.

使用下面的代码,它将处理来自服务器的各种故障,您可能需要升级到最新版本的 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. 检测到错误:属性中的序列化日期数据类型错误 对象 PuntoGpsRecorridoDTO 发送 POJO Web 服务。

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

解决方案:替换为:

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

上课时间:

JsonDateDeserializer class:

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 class:

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;
    }
}

编程愉快...