繁体   English   中英

日期格式从 Android (java) 到 Spring Boot

[英]Date format from Android (java) to Spring Boot

我正在使用 Android Studio (java) 制作我的应用程序的前面部分,我使用 Spring Boot 到后面的部分。

SQL 数据库使用 TimeStamp。

所以我的问题是,当我从前面(Android)向后面(Spring)发送 object 时会抛出一个错误:

已解决 [org.springframework.http.converter.HttpMessageNotReadableException: JSON 解析错误:无法从字符串“2021 年 2 月 18 日 2:47:40 AM”中反序列化java.util.Date类型的值:不是有效表示(错误:无法解析日期值“2021 年 2 月 18 日 2:47:40 AM”:无法解析日期“2021 年 2 月 18 日 2:47:40 AM”:不兼容任何标准 forms(“yyyy-MM-dd'T'HH :mm:ss.SSSX", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd")); 嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“2021 年 2 月 18 日 2:47:40 AM”中反序列化类型java.util.Date的值:不是有效表示(错误:无法解析日期值“2021 年 2 月 18 日 2:47:40 AM”:无法解析日期“2021 年 2 月 18 日 2:47:40 AM”:与任何标准 forms(“yyyy-MM-dd'T'HH: mm:ss.SSSX", "yyyy-MM-dd'T'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”保留在 Date 变量中,它是一个日期。 但是当我发送相同的 object 返回时,它发送:

{"estadoSolicitud":0,"fecha":"Feb 18, 2021 2:47:40 AM","id":23}

提前谢谢你 <3

代码:Spring请求 class:

@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接收<Solicitud> object 的 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);
    }   
}

Android (前半部分)征求Model:

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 function使用请求方法:

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


    }

我认为您必须尝试将Joda Time 库作为日期字段的通用中间件。

您没有显示任何实际代码,因此不可能给出明确的答案,但您需要确保无论您使用什么将 java 对象序列化为 Android 端的 Json 正确地将日期序列化为 ISO-8601 格式。

大多数主流的 Json 序列化程序,例如 Gson,默认情况下都会这样做。

异常是说您从客户端(android)发送的值具有不同的数据类型,与您在后端(Spring)中获取的数据类型不同。

两端的数据类型必须相同。

请试试这个

Spring 代码:你可以用JsonFormat注解提到日期格式

字符串 DATE_FORMAT_MM_DD_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中的日期发送到后端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM