La deserialización de jackson falló InvalidFormatException: no se puede deserializar el valor del tipo java.util.Date

Al convertir el tipo Cadena a Fecha, la sesión de deserialización falla;

caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException:
Can not deserialize value of type java.util.Date from String
“2018-12-25 10:07:49”: not a valid representation (error: Failed to
parse Date value ‘2018-12-25 10:07:49’: Can not parse date “2018-12-25
10:07:49Z”: while it seems to fit format
‘yyyy-MM-dd’T’HH:mm:ss.SSS’Z’’, parsing fails (leniency? null))

Primero probó la anotación @DateTimeFormat, no encontró ningún efecto y aun así informó un error;
luego probó la anotación @JsonFormat y la interfaz era normal;

En mi impresión, @DateTimeFormat es para la conversión de formato de datos al ingresar parámetros, y @JsonFormat es para la conversión de formato al generar parámetros, ¿por qué de repente no funciona?

Después de buscar un poco, encontré la siguiente explicación:

Por lo general, @DateTimeFormat se usa para convertir la cadena de tiempo que se pasa al fondo en fecha, y @JsonFormat se usa para convertir la fecha transmitida desde el fondo en una cadena de tiempo, pero @DateTimeFormat solo se usará en parámetros de solicitud similares a @RequestParam (parámetros de empalme de URL solo tendrá efecto, si se coloca en los datos del formulario en RequestBody, no será válido), si @DateTimeFormat se coloca en @RequestBody, no será válido.

En @RequestBody, puede usar @JsonFormat para convertir la cadena de tiempo que pasó al fondo en Fecha, lo que significa que @JsonFormat puede convertir la cadena de tiempo que pasó al fondo en Fecha o convertir la Fecha que pasó del fondo en cadena de tiempo.

En cuanto a por qué no funcionó, no di más detalles. Del análisis del informe de error, debería ser que la forma de desecuenciar las palabras es diferente, lo que hace que la anotación @DateTimeFormat no tenga efecto.

Razones adicionales y múltiples soluciones

razón

fastjson默认使用的序列化格式:

public static String DEFFAULT_DATE_FORMAT = “yyyy-MM-dd
HH:mm:ss”;

jackson默认支持的日期反序列格式:

(“yyyy-MM-dd’T’HH:mm:ss.SSSZ”, “yyyy-MM-dd’T’HH:mm:ss.SSS’Z’”, “EEE,dd MMM yyyy HH:mm:ss zzz”, “yyyy-MM-dd”))
jackjson解析框架在解析实体类里面是date数据类型的数据时的默认格式是:UTC类型,即yyyy-MM-dd’T’HH:mm:ss.SSS
并且默认为+8时区,即时间基础上加8小时,

Springboot使用的默认json解析框架是jackjson框架

Solución 1: reescriba la deserialización de Jackson

importar com.fasterxml.jackson.core.JsonParser;
importar com.fasterxml.jackson.core.JsonProcessingException;
importar com.fasterxml.jackson.databind.DeserializationContext;
importar com.fasterxml.jackson.databind.JsonDeserializer;

importar java.io.IOException;
importar java.text.ParseException;
importar java.texto.SimpleDateFormat;
importar java.util.Date;

/**

  • @versión 1.0.0
  • @description anula la deserialización
  • @fecha 2018/12/25 9:51
    **/

clase pública CustomJsonDateDeserializer extiende JsonDeserializer { @Override public Date deserialize(JsonParser jp, DeserializationContext ctxt) lanza IOException, JsonProcessingException { formato SimpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); Cadena fecha = jp.getText(); intente { formato de retorno. parse (fecha); } catch (ParseException e) { throw new RuntimeException(e); } } }










1

Agregue anotaciones en los atributos de fecha requeridos:

@JsonDeserialize(using = CustomJsonDateDeserializer.class)
private Date txnTime;
De esta manera, debe reescribir la clase abstracta de deserialización anterior

Solución 2: use la anotación @JsonFormat para especificar el formato de recepción requerido sin volver a escribir la deserialización:

//GMT+8表示时区,东八区,需加上时区,shape 默认是JsonFormat.Shape.ANY,
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date txnTime;

1
2
3

Solución 3: si se excluye el marco jackjson, use anotaciones fastjson y no reescriba la deserialización

@JSONField(formato = “yyyy-MM-dd HH:mm:ss”)
privado Fecha txnTime;

1
2

Dependencias que deben agregarse:

      <!-- fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.32</version>
</dependency>
<!-- jackson-->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.6.4</version>
</dependency>

Finalmente, se introduce una forma de modificar globalmente el formato de hora de recepción.

Use MappingJackson2HttpMessageConverter para configurar la clase de inicio Application.Java y especifique el formato de recepción.No lo recomiendo, porque es global y no muy flexible, así que entiéndalo.

@Bean
public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); //设置日期格式ObjectMapper objectMapper = new ObjectMapper(); SimpleDateFormat smt = new SimpleDateFormat(“yyyy-MM-dd”); mapeador de objetos.setDateFormat(smt); mapeoJackson2HttpMessageConverter.setObjectMapper(objectMapper); //设置中文编码格式List list = new ArrayList(); list.add(MediaType.APPLICATION_JSON_UTF8); mapeoJackson2HttpMessageConverter.setSupportedMediaTypes(lista); volver mapeoJackson2HttpMessageConverter; }











Supongo que te gusta

Origin blog.csdn.net/qq_34690003/article/details/131596800
Recomendado
Clasificación