我和androidstudio(java)一起工作,使前端成为我的应用程序的一部分,我和spring boot一起工作到后端。
sql数据库使用时间戳。
所以我的问题是,当我将一个对象从前面(android)发送到后面(spring)时,会抛出一个错误:
已解析[org.springframework.http.converter.httpMessageNoteableException:json解析错误:无法反序列化类型的值 java.util.Date
from string“feb 18,2021 2:47:40 am”:不是有效的表示形式(错误:无法分析日期值“feb 18,2021 2:47:40 am”:无法分析日期“feb 18,2021 2:47:40 am”:与任何标准格式(“yyyy-mm-dd't'hh:mm:ss.sssx”,“yyy-mm-dd't'hh:mm:ss.sss”,“eee,dd-mmm yyyy hh:mm:ss zzz”,“yyyy-mm-dd”)都不兼容;嵌套异常为com.fasterxml.jackson.databind.exc.invalidformatexception:无法反序列化类型的值 java.util.Date
from string“feb 18,2021 2:47:40 am”:不是有效的表示形式(错误:无法分析日期值“feb 18,2021 2:47:40 am”:无法分析日期“feb 18,2021 2:47:40 am”:与任何标准格式(“yyyy-mm-dd'hh:mm:ss.sssx”,“yyy-mm-dd'hh:mm:ss.sss”,“eee,dd-mmm yyyy hh:mm:ss zzz”)不兼容,“yyyy-mm-dd”)),[来源:(pushbackinputstream);行:1,列:123](通过引用链:com.prueba.dataproviders.model.solicitud[“fecha”])]
所以我猜问题出在android向spring发送信息,但我不知道如何处理它。。。
更多信息:这是我从spring向android发送信息的一个示例:
{
"id": 23,
"fecha": "2021-02-18T02:47:40.000+00:00",
"estadoSolicitud": 1
}
我将属性“fecha”保存在日期变量中,其中包含一个日期。但当我把同一个物体送回去时,它会发出:
{"estadoSolicitud":0,"fecha":"Feb 18, 2021 2:47:40 AM","id":23}
提前谢谢<3
code:at spring 请求类:
@Entity
@Table(name = "solicitud")
public class Solicitud implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@GenericGenerator(name = "increment", strategy = "increment")
@Column(name = "id")
private int id;
@Column(name = "fecha", insertable = false)
private Date fecha;
@Column(name="estadoSolicitud")
private int estadoSolicitud; // "0 Pendiente, 1 Realizada 2 Rechazada
在spring中,返回接收对象的post方法:
@RequestMapping(value = "/solicitudes/gestionarSolicitud/{estadoSol}", method = RequestMethod.POST, produces = "application/json")
public ResponseEntity<Object> setSolicitud(@RequestBody Solicitud solicitud, @PathVariable(value="estadoSol") int estadoSol ){
Optional<Solicitud> optionalSolicitud = solicitudService.gestionarSolicitud(solicitud, estadoSol);
if (optionalSolicitud.isPresent()) {
return new ResponseEntity<Object>(optionalSolicitud.get(), HttpStatus.OK);}
} else {
return new ResponseEntity<Object>(null , HttpStatus.OK);
}
}
在安卓(前部)车型上:
public class Solicitud implements Serializable {
private int id;
private Date fecha;
private int estadoSolicitud; // 0 pendiente 1 Aceptada 2 Rechazada
//getters && setters...
}
在android中,请求post方法返回的请求方法:
public interface SolicitudService {
@POST("/solicitudes/gestionarSolicitud/{estadoSol}")
Call<Solicitud> gestionarSolitud( @Body Solicitud solicitud, @Path("estadoSol") int estadoSol);
}
在android中,使用请求方法的函数:
private void gestionarSolicitud(@NotNull Solicitud solicitud, int estadoSol) {
SolicitudService solicitudService = ApiClient.getClient().create(SolicitudService.class);
Call<Solicitud> call = solicitudService.gestionarSolitud(solicitud, estadoSol);
call.enqueue(new Callback<Solicitud>() {
@Override
public void onResponse(Call<Solicitud> call, Response<Solicitud> response) {
Solicitud solActualizada = response.body();
if (solActualizada != null && solActualizada.getEstadoSol() == estadoSol) {
if (estadoSol == 1)
Toast.makeText(context, "Usuario registrado correctamente", Toast.LENGTH_LONG).show();
else if (estadoSol == 2)
Toast.makeText(context, "Solicitud rechazada", Toast.LENGTH_LONG).show();
notifyDataSetChanged();
} else {
Toast.makeText(context, "Ups! Ha ocurrido un error", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<Solicitud> call, Throwable t) {
Toast.makeText(context, "Ups! Ha ocurrido un error del servidor.", Toast.LENGTH_LONG).show();
}
});
}
3条答案
按热度按时间xwmevbvl1#
我认为您必须尝试使用joda时间库作为日期字段的通用中间件。
2w3rbyxf2#
您还没有显示任何实际的代码,因此不可能给出明确的答案,但是您需要确保在android端将java对象序列化为json所使用的任何方法都能将日期正确地序列化为iso-8601格式。
大多数主流的json序列化程序,例如gson,默认情况下都会这样做。
kmbjn2e33#
例外情况是,您从客户端(android)发送的值具有不同的数据类型,即您在后端(spring)中获取的数据类型。
两端的数据类型必须相同。
请试试这个
spring代码:您可以使用jsonformat注解提到日期格式
字符串日期\u格式\u mm\u dd \u yyyy=“mm/dd/yyyy”
对于android代码:获取日期,您可以使用以下代码更改日期格式您可以这样定义日期格式:
在请求中将日期从android发送到后端。