could not read JSON: Can not construct instance of Java.util.Date from String
value '2012-07-21 12:11:12': not a valid representation("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"))
passer la requête json à REST dans un POJO class.user doit entrer uniquement au format datetime ci-dessous, sinon il doit envoyer un message. pourquoi DateSerializer n'appelle pas?
add(@Valid @RequestBody User user)
{
}
json:
{
"name":"ssss",
"created_date": "2012-07-21 12:11:12"
}
variable de classe pojo
@JsonSerialize(using=DateSerializer.class)
@Column
@NotNull(message="Please enter a date")
@Temporal(value=TemporalType.TIMESTAMP)
private Date created_date;
public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
logger.info("serialize:"+value);
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("DateSerializer formatter:"+formatter.format(value));
jgen.writeString(formatter.format(value));
}
J'ai le même problème, donc j'écris une désérialisation de date personnalisée avec @JsonDeserialize(using=CustomerDateAndTimeDeserialize.class)
public class CustomerDateAndTimeDeserialize extends JsonDeserializer<Date> {
private SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
@Override
public Date deserialize(JsonParser paramJsonParser,
DeserializationContext paramDeserializationContext)
throws IOException, JsonProcessingException {
String str = paramJsonParser.getText().trim();
try {
return dateFormat.parse(str);
} catch (ParseException e) {
// Handle exception here
}
return paramDeserializationContext.parseDate(str);
}
}
Annotez votre created_date
champ avec l'annotation JsonFormat
pour spécifier le format de sortie.
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())
Notez que vous devrez peut-être passer dans des paramètres régionaux et une zone horaire différents s'ils doivent être basés sur autre chose que ce que le serveur utilise.
Vous pouvez trouver plus d'informations dans la documentation .
JSON
à ce jour, ce processus est appelé deserialization
, pas serialization
.Pour lier une chaîne JSON
à ce jour, créez une désérialisation de date personnalisée, annotez created_date
Ou son setter avec
@JsonDeserialize(using=YourCustomDateDeserializer.class)
où vous devez implémenter la méthode public Date deserialize(...)
pour dire à Jackson comment convertir une chaîne en date.
Prendre plaisir.
Encore une autre façon est d'avoir un objet Date personnalisé qui s'occupe de sa propre sérialisation.
Bien que je ne pense pas vraiment que l'extension d'objets simples comme Date
, Long
, etc. soit une bonne pratique, dans ce cas particulier, cela rend le code facilement lisible, a un seul point où le format est défini et est plutôt plus que moins compatible avec un objet normal Date
.
public class CustomFormatDate extends Date {
private DateFormat myDateFormat = ...; // your date format
public CustomFormatDate() {
super();
}
public CustomFormatDate(long date) {
super(date);
}
public CustomFormatDate(Date date) {
super(date.getTime());
}
@JsonCreator
public static CustomFormatDate forValue(String value) {
try {
return new CustomFormatDate(myDateFormat.parse(value));
} catch (ParseException e) {
return null;
}
}
@JsonValue
public String toValue() {
return myDateFormat.format(this);
}
@Override
public String toString() {
return toValue();
}
}
J'ai résolu cela en utilisant les étapes ci-dessous.
1.Dans la classe d'entité, annotez-le à l'aide de @JsonDeserialize
@Entity
@Table(name="table")
public class Table implements Serializable {
// Some code
@JsonDeserialize(using= CustomerDateAndTimeDeserialize.class)
@Temporal(TemporalType.TIMESTAMP)
@Column(name="created_ts")
private Date createdTs
}