Error with timezone in #DateTimeFormat - java

I'm using Spring's #DateTimeFormat annotation in order to parse the output of toISOString() from javascript:
#RequestMapping(method=RequestMethod.GET)
public #ResponseBody List<Entity> search(#RequestParam("date") #DateTimeFormat(pattern="\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\"") Date date) {
return service.search(date);
}
The URL ends up looking like: ?date="2014-07-14T19:19:33.625Z" which seems correct. #DateTimeFormat is not correctly parsing the timezone, it seems like it wants UTC to be represented as '-0000' instead of 'Z'
Am I doing something wrong? You would expect #DateTimeFormat(iso=ISO.DATE_TIME) to work with javascript toISOString(), except js is adding the quotes and 'Z' doesn't seem to work.
This is Spring 3.1.

Related

Disable converting epoch to date on Springboot

I have the following springboot request:
#Data
#ToString
public class OffsetDate {
public OffsetDateTime time;
}
And my request goes:
{
"time" : 20000101
}
Right now, that is being converted to date during serialization: 1970-01-01T05:33:20.101Z - which I don't want to happen.
I need to be able to specify the format and fail if it's invalid without custom annotations (request code is actually autogenerated from swagger yaml, hence I cannot modify the request).
Is there a way to do that?

Date format time on Spring Doc swagger API

I'm trying to generate the documentation from my springboot application using spring doc , this is some of the attributes of the class which is causing me issues:
public class user {
#JsonFormat(pattern = "yyyy-MM-dd")
private Date dateOfBirth;
}
With the Spring doc annotation, in the swagger i got this:
dateOfBirth* string($date-time)
"dateOfBirth": "2020-04-29T14:15:32.475Z"
while i would like to have this:
dateOfBirth* string($date)
"dateOfBirth": "2020-04-29"
How to do that? I think to be close to solution but i can't firugre out what i'm missing
I think the answer you are looking for is here: swagger date field vs date-time field
Date is an object DateTime for swagger, as it is really a DateTime object. Use the appropriate type, like LocalDate, they know how to handle that.
By the way, how would you expect Swagger to properly convert a Date Pattern into the appropriate type ? It's like too much magic. Swagger relies on thing that are common practices.
The JSONFormat won't change how swagger interpret your data.

Jackson accepting negative dates

I am trying to get a date field from JSON in a spring-boot application with Jackson. The JSONFormat looks like this:
#NotNull(message = ValidationErrors.NOT_BLANK_MESSAGE)
#JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd")
private Date date;
It works fine for most of the cases but when I pass 2017-0526, it is automatically converting it to 10th of May, 2018.
I want to throw exception in case the date is not in the yyyyMMdd format or contains minus sign. I tried going through stack overflow and Jackson documentation, but couldn't find anything.
Why is JsonFormat accepting negative dates?
Is there any workaround for this, so that it throws exception when such dates are passed?
This is an issue with the underlying Java class that parses dates. The parser is by default lenient and will parse dates that seem wrong. For stricter parsing you need to set the lenient property to false with the setLenient method. E.g. this setup will result in a InvalidFormatException when parsing a JSON with a date string "2017-0526":
ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
df.setLenient(false);
mapper.setDateFormat(df);
At the moment you can't configure this through a #JsonFormat annotation. There seems to be a plan for that for version 2.9.0. Link to issue at github
I wanted something that will affect the whole (spring-boot) project and came up with this:
#Configuration
public class JsonConfiguration {
#Bean
public Jackson2ObjectMapperBuilderCustomizer customize() {
return builder -> builder
.dateFormat(StdDateFormat.instance.withLenient(false))
.build();
}
}

json date format in spring-boot

I am using spring-boot and I have an entity class defined something like this
import org.joda.time.LocalDateTime;
#Entity
public class Project {
#Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
private LocalDateTime start_date;
...
...
}
When this class is converted to JSON, the field gets converted to the following string representation
{"start_date":[2014,11,15,0,0,0,0],...., ...}
I want to have the json response as yyyy-MM-dd.
I tried the #DateTimeFormat(iso = ISO.DATE) annotation and that did not help either.
Is there an easy way to do this conversion to proper json format ?
There are three things that you need to do to format the date as yyyy-MM-dd:
Add a dependency on com.fasterxml.jackson.datatype:jackson-datatype-joda. Judging by the output you're getting at the moment, I think you may already have this dependency.
Configure Jackson not to format dates as timestamps by adding spring.jackson.serialization.write-dates-as-timestamps: false to your application.properties file.
Annotate the LocalDataTime field or getter method with #JsonFormat(pattern="yyyy-MM-dd")
Note: You'll need to use Spring Boot 1.2 for step 2 to work.
Without additional dependency - the only thing I had to do is:
To take care send date from client as string object, in format yyyy/MM/dd
In Spring Boot application, to add annotation on the date field with
the same format
public class Foo
{
#JsonFormat(pattern = "yyyy/MM/dd")
private Date dueDate;
}
Using Spring Boot 2.3.5 version
Update
Another option, instead of step 2, to modify application.properties file, add there the format for any Date object:
spring.jackson.date-format=yyyy/MM/dd
You can use #JsonFormat annotation in and the desired pattern like this without using any dependency :
#JsonFormat(pattern="yyyy-MM-dd")
private Date created_At;
Took me some time struggling with Spring Boot Application + Date Format for my input so I'll try to resume what I saw.
If your date is argument to a function, you can use #DateTimeFormat(pattern = "yyyy-MM-dd") to define a pattern (ie. org.springframework.format.annotation.DateTimeFormat).
If your date is inside an object argument to the function, you can use #JsonFormat(pattern = "yyyy-MM-dd") to define a pattern (ie. com.fasterxml.jackson.annotation.JsonFormat)
If neither of these works, you can try changing your date Type, for me I had tu use org.joda.time.LocalDate in order to make it work with option 2 :
#JsonFormat(pattern = "dd/MM/yyyy")
private org.joda.time.LocalDate date;

Spring mvc #DateTimeFormat not working as expected

I just added a jQuery date picker to my simple page made in jsp. Using Spring mvc 4.0.0. I would like to have java.util.Date field in my model class and let spring to convert the date String coming from the front end to date. My issue is that, if i have
#DateTimeFormat(pattern = "dd/MM/yy")
private Date startDate;
In my model class I receive null value in my spring controller. (The startDate setter is not called neither) If i change the startDate to be a simple String, than the value is populated correctly and in the controller i am able to retrieve the startDate string. Could you please advice what am I missing?
Was trying to follow the http://gerrydevstory.com/2013/05/21/binding-date-form-input-on-spring-mvc/ seems that no other tricks has been used to convert the String to Date.
Try this:
#DateTimeFormat(pattern=dd/MM/YY)
private Date startDate;
Maybe it's not working with Date, have you tried using DateTime instead?
I think you shoule put #DateTimeFormat under the #RequestMapping, like below:
#RequestMapping
public String someMethod(#RequestParam(value="date", required=false)#DateTimeFormat(pattern="dd/MM/YY") Date date)

Categories

Resources