How can I set the format for a Date in a text field with Spring MVC?
I\'m using the Spring Form tag library and the input
tag.
What I get now is
Done! I just added this method to my controller class:
@InitBinder
protected void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
binder.registerCustomEditor(Date.class, new CustomDateEditor(
dateFormat, false));
}
register a date editor in yr controller :
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(LocalDate.class, new LocalDateEditor());
}
and then the data editor itself can look like this :
public class LocalDateEditor extends PropertyEditorSupport{
@Override
public void setAsText(String text) throws IllegalArgumentException{
setValue(Joda.getLocalDateFromddMMMyyyy(text));
}
@Override
public String getAsText() throws IllegalArgumentException {
return Joda.getStringFromLocalDate((LocalDate) getValue());
}
}
I am using my own abstract utility class (Joda) for parsing dates, in fact LocalDates from Joda Datetime library - recommended as the standard java date/calendar is an abomination, imho. But you should get the idea. Also, you can register a global editor, so you don't have to do it each controller (I can't remember how).
If you want to format all your dates without having to repeat the same code in every Controller, you can create a global InitBinder in a class annotated with @ControllerAdvice annotation.
1. Create a DateEditor class that will format your dates, like this:
public class DateEditor extends PropertyEditorSupport {
public void setAsText(String value) {
try {
setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value));
} catch(ParseException e) {
setValue(null);
}
}
public String getAsText() {
String s = "";
if (getValue() != null) {
s = new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue());
}
return s;
}
2. Create a class annotated with @ControllerAdvice (I called it GlobalBindingInitializer):
@ControllerAdvice
public class GlobalBindingInitializer {
/* Initialize a global InitBinder for dates instead of cloning its code in every Controller */
@InitBinder
public void binder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new DateEditor());
}
}
3. In your Spring MVC configuration file (for example webmvc-config.xml) add the lines that allow Spring to scan the package in which you created your GlobalBindingInitializer class. For example, if you created GlobalBindingInitializer in the org.example.common package:
<context:component-scan base-package="org.example.common" />
Finished!
Sources: