Sometimes we may need to send date in different formats when posting a form or post json objects. Since spring automatically binds the fields of that object (When you use @ModelAttribute/@RequestBody), some field may not automatically be bound.
Think about Date object. Sometimes we may need to bind a date format like Aug 25, 2017 or 11-06-2005 etc. Spring may not bind these dates automatically. In that case we will have to configure spring to bind these format of date strings automatically.
1. Write a Custom Date Format class
public class CustomDateFormat extends DateFormat {
private static final List<? extends DateFormat> DATE_FORMATS = Arrays.asList(
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
);
@Override
public StringBuffer format(final Date date, final StringBuffer toAppendTo, final FieldPosition fieldPosition) {
throw new UnsupportedOperationException("This custom date formatter can only be used to *parse* Dates.");
}
@Override
public Date parse(final String source, final ParsePosition pos) {
Date res;
for (final DateFormat dateFormat : DATE_FORMATS) {
if ((res = dateFormat.parse(source, pos)) != null) {
return res;
}
}
return null;
}
}
Here we’ve specified 3 types of date format that will be automatically bound with Date object. We can add as more date formats as we want.
2. Register DateFormat
Now we need to register this CustomDateFormat in @ControllerAdvice bean class.
@ControllerAdvice
public class CustomDateEditorRegistrer implements PropertyEditorRegistrar {
@InitBinder
@Override
public void registerCustomEditors(PropertyEditorRegistry registry) {
registry.registerCustomEditor(Date.class, new CustomDateEditor(new CustomDateFormat(), true));
}
}
When you add @ControllerAdvice annotation on a class, it’ll invoke before any @Controller class
That’s all, spring will bind string that has one of the above three formats with Date property.