Set date format for an input text using Spring MVC

后端 未结 3 1412
既然无缘
既然无缘 2020-12-15 13:33

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

相关标签:
3条回答
  • 2020-12-15 13:49

    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));
    }
    
    0 讨论(0)
  • 2020-12-15 13:51

    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).

    0 讨论(0)
  • 2020-12-15 14:05

    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.

    Steps

    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:

    • Keenformatics - How To create a global InitBinder in Spring with @ControllerAdvice (my blog)
    • Spring Framework 3.2.4 - Annotation Type ControllerAdvice
    • Spring Framework API 2.5 - Annotation Type InitBinder
    • Personal experience
    0 讨论(0)
提交回复
热议问题