从android(java)到spring boot的日期格式

qojgxg4l  于 2021-07-23  发布在  Java
关注(0)|答案(3)|浏览(296)

我和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();
            }
        });

    }
xwmevbvl

xwmevbvl1#

我认为您必须尝试使用joda时间库作为日期字段的通用中间件。

2w3rbyxf

2w3rbyxf2#

您还没有显示任何实际的代码,因此不可能给出明确的答案,但是您需要确保在android端将java对象序列化为json所使用的任何方法都能将日期正确地序列化为iso-8601格式。
大多数主流的json序列化程序,例如gson,默认情况下都会这样做。

kmbjn2e3

kmbjn2e33#

例外情况是,您从客户端(android)发送的值具有不同的数据类型,即您在后端(spring)中获取的数据类型。
两端的数据类型必须相同。
请试试这个
spring代码:您可以使用jsonformat注解提到日期格式
字符串日期\u格式\u mm\u dd \u yyyy=“mm/dd/yyyy”

@JsonFormat(pattern = DATE_FORMAT_MM_DD_YYYY)
private Date fetching_date;

对于android代码:获取日期,您可以使用以下代码更改日期格式您可以这样定义日期格式:

const val DATE_FORMAT_yyyy_MM_dd_HH_mm_ss_a = "yyyy-MM-dd HH:mm:ss a"
const val DATE_FORMAT_MMM_dd_yyyy = "MMM dd, yyyy"
const val DATE_FORMAT_MMM_dd_yyyy_HH_MM_AA = "MMM dd, yyyy hh:mm aa"
const val DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd"

//Convertion of one date format to another
        fun convertDateFormat(oldFormat: String, newFormat: String, dateString: String): String {
            var sdf = SimpleDateFormat(oldFormat)
            try {
                val date = sdf.parse(dateString)
                sdf = SimpleDateFormat(newFormat, getLocalForDateFormat())
                return sdf.format(date)
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return ""
        }

在请求中将日期从android发送到后端。

相关问题