在 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());
}
});
这就是解决方案!
检测到错误:属性中的序列化日期数据类型错误
对象 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;
}
}
编程愉快...
我找不到这些代码行中语义错误的位置:
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());
}
});
这就是解决方案!
检测到错误:属性中的序列化日期数据类型错误 对象 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;
}
}
编程愉快...