Android can't parse java.sql.Timestamp - java

My Rest API has the following field:
#JsonProperty(access = JsonProperty.Access.READ_ONLY)
#Column(name = "timestamp")
#CreationTimestamp
private Timestamp timestamp;
When the following JSON is returned as a response from the API to Android:
{"timestamp":"2023-01-05T12:33:32.883+00:00"}
I am parsing it like this:
x.setTimestamp(java.sql.Timestamp.valueOf(arr.getJSONObject(i).getString("timestamp")));
While the field is of type java.sql.Timestamp on both API and Android, i am getting the following exception:
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

Related

How to parse LocalDate with Jackson

I am facing problem passing date as json data through postman. In case of Mandetory date with #NotNull annotation, no problem. The other date is accepting null. But at the time of updation, that date creates problem.
I am using Java 1.8 with spring boot & MySql DB. Please help
The following links I have visited, but does not fit with this.
LocalDateTime parsing with jackson
JSON parse error: Can not construct instance of java.time.LocalDate: no String-argument constructor/factory method to deserialize from String value
https://stackoverflow.com/a/29959842/3415090
JSON Java 8 LocalDateTime format in Spring Boot
I have also used
#JsonSerialize(using = LocalDateSerializer.class)
#JsonDeserialize(using = LocalDateDeserializer.class)
But problem remains as it is.
My UX
public class LeaveApplUx {
#JsonIgnore
#Size(max = 5, message = "Employee Code Must Be Within 4 To 5 Character Long Or Blank")
private final String employeeCode;
#NotNull(message = "Start Date Empty")
#JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private final LocalDate startDate;
#JsonIgnore
#JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
private final LocalDate rejoinDate;
public LeaveApplUx(
#Size(min = 4, max = 5, message = "Employee Code Must Be Within 4 To 5 Character Long Or Blank")
#JsonProperty("employeeCode") String employeeCode,
#NotNull(message = "Start Date Empty") #JsonProperty("startDate") LocalDate startDate,
#JsonProperty("rejoinDate") LocalDate rejoinDate) {
this.employeeCode = employeeCode;
this.startDate = startDate;
this.rejoinDate = rejoinDate;
}
// GETTERS
}
At the time of creation, it works fine.
{
"employeeCode": "B426",
"startDate": "01-03-2023"
}
Input Parameters : {"employeeCode":"B426","startDate":{"year":2023,"month":"MARCH","monthValue":3,"dayOfMonth":1,"leapYear":false,"dayOfWeek":"WEDNESDAY","dayOfYear":60,"era":"CE","chronology":{"id":"ISO","calendarType":"iso8601"}},"rejoinDate":null}
Record saved properly in DB
But at the time of updation, it creates error.
{
"employeeCode": "B426",
"startDate": "01-03-2023",
"rejoinDate": "06-03-2023"
}
JSON parse error:
Cannot deserialize value of type `java.time.LocalDate` from String "06-03-2023": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '06-03-2023' could not be parsed at index 0; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDate` from String "06-03-2023": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '06-03-2023' could not be parsed at index 0
at [Source: (PushbackInputStream); line: 14, column: 19] (through reference chain: org.myapp.ux.hr.leave.LeaveApplUx["rejoinDate"])
Since you set values through contructor, not setters, you should put #JsonFormat(...) on constructor parameters, not fields. This should fix it:
public class LeaveApplUx {
#JsonIgnore
private final String employeeCode;
private final LocalDate startDate;
#JsonIgnore
private final LocalDate rejoinDate;
public LeaveApplUx(#JsonProperty("employeeCode") String employeeCode,
#JsonProperty("startDate") #JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") LocalDate startDate,
#JsonProperty("rejoinDate") #JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") LocalDate rejoinDate) {
this.employeeCode = employeeCode;
this.startDate = startDate;
this.rejoinDate = rejoinDate;
}
//getters
}

Getting "JSON Binding deserialization" error while json mapping to object

Getting below error while deserialization
javax.ws.rs.client.ResponseProcessingException: javax.ws.rs.ProcessingException: RESTEASY008200: JSON Binding deserialization error: javax.json.bind.JsonbException: Unable to deserialize property 'birthDate' because of: Error parsing class java.util.Date from value: 1999-04-11. Check your #JsonbDateFormat has all time units for class java.util.Date type, or consider using org.eclipse.yasson.YassonProperties#ZERO_TIME_PARSE_DEFAULTING.
I have added below annotations still not working
#JsonDeserialize(using = LocalDateDeserializer.class)
#JsonProperty
#JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
#JsonbProperty
#JsonbDateFormat(value = "yyyy-MM-dd", locale = "Locale.ENGLISH")
public Date getbirthDate() {
return birthDate;
}
for my class, I was using localdatetime. I had to add this anotation over the entity column
#JsonDeserialize(using = LocalDateTimeDeserializer.class)
#JsonSerialize(using = LocalDateTimeSerializer.class)
public LocalDateTime effectiveTimestamp;

How to enforce DateTime format in Spring Boot API Request?

I have a class like this. I want to enforce that the two Date fields should take in the request only if the date in request comes in a valid ISO Date time format like: 2021-01-19T12:20:35+00:00
#Data
#AllArgsConstructor
#NoArgsConstructor
#Builder
#Validated
public class EDDDetail {
#NotBlank
private String versionId;
#NotNull
private Date minTime;
#NotNull
private Date maxTime;
}
How to achieve this? Currently this accepts a date in long format (epoch time [e.g.: 1611058835000] ) and other valid dates as well like 22-02-2021 etc.
I want to throw a bad request if the date format in the request is not an ISO format date.
You can use #JsonFormat annotation with provided pattern to format the date
E.g:
#JsonFormat(pattern = "yyyy-MM-dd")
You can use the #JsonFormat annotation to define your pattern:
#NotNull
#JsonFormat(pattern="dd-MM-yyyy")
private Date minTime;
#NotNull
#JsonFormat(pattern="dd-MM-yyyy")
private Date maxTime;
If you want to accept multiple patterns you can get some implementation on this link: Configure Jackson to parse multiple date formats

Java LocalDate - Time gets appended onto date when saving in MongoDB?

I have the following Java Entity:
public class Round {
private ObjectId _id;
#NotEmpty
#Getter
#Setter
#Accessors(fluent = true)
#JsonProperty("userId")
private String userId;
#JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
#JsonDeserialize(using = LocalDateDeserializer.class)
#JsonSerialize(using = LocalDateSerializer.class)
#Getter
#Setter
#Accessors(fluent = true)
#JsonProperty("date")
private LocalDate date;
//other fields
}
When I do a POST to my Spring Boot REST web app with JSON Body:
{
"userId": "user3",
"date": "20-01-2020"
}
The date is persisted in Mongo as follows:
2020-01-20T00:00:00.000+00:00
How can I get the date to persist as simply:
20-01-2020
It's not Java problem, MongoDB uses Date format similar to JavaScript Date format.
If you want to save just dd-MM-YYYY you may want to change your column type to String.
If it's not possible then you need to rewrite your serializer to return String representation of date (and of course rewrite deserializer to parse that string into LocalDate

Spring Date Format

I have an angular app which send me a date like this dd/MM/yyyy.
I would like to insert this date in the database.
Here is my entity
#Entity
public class Individu implements Serializable {
#Id
private String nui;
private int civility;
private String lastName;
private String useName;
private String firstName;
#Temporal(TemporalType.DATE)
#DateTimeFormat(pattern="dd/MM/yyyy")
private Date birthDate;
but when i run my SpringBootApp i always have this error:
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.Date` from String "20/02/1990": not a valid representation (error: Failed to parse Date value '20/02/1990': Cannot parse date "20/02/1990": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"));
Is some one have a solution for me?
You need #JsonFormat:
#JsonFormat(pattern="dd/MM/yyyy")
private Date birthDate;

Categories