2013-08-25 20 views
9

mam typ danych w mojej aplikacji o nazwie Foo, który wygląda mniej więcej tak:Jak skonfigurować specyficzny dla sterownika program do formowania pola ze Spring MVC?

public class Foo { 
    // synthetic primary key 
    private long id; 

    // unique business key 
    private String businessKey; 

    ... 
} 

Ten typ jest używany w wielu formach w całej aplikacji internetowej i zazwyczaj chcesz, aby przekształcić go w tę iz powrotem za pomocą właściwości id więc zaimplementowałem formater Spring3, który to robi i zarejestrował ten formatator z globalną usługą konwersji wiosennej.

Jednak mam jeden przypadek użycia formularza, w którym chcę przekonwertować, używając zamiast tego businessKey. Łatwo jest zaimplementować formatter, aby to zrobić, ale jak mogę powiedzieć Springowi, aby używał tego formatyzatora tylko dla tej konkretnej formy?

znalazłem dokument w http://static.springsource.org/spring/previews/ui-format.html który ma sekcję o rejestracji formatek pól specyficznych (patrz 5.6.6 całą drogę na dole), która oferuje ten przykład:

@Controller 
public class MyController { 
    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
    binder.registerFormatter("myFieldName", new MyCustomFieldFormatter()); 
    }   
    ... 
} 

To jest dokładnie to, co chcę , ale jest to dokument podglądu z 2009 roku i nie wygląda na to, że metoda registerFormatter wprowadziła go do finalnego wydanego interfejsu API.

Jak to zrobić?

+2

Wydaje się, że nie może zobaczyć [SPR-7773] (https: //jira.springsource. org/browse/SPR-7773), [SPR-6069] (https://jira.springsource.org/browse/SPR-6069) i [SPR-6015] (https://jira.springsource.org/browse/ SPR-6015) –

+0

Wow, masz rację. To wielka dziura i sądząc po wpisach z JIRA, a nie takiej, którą zespół Wiosen bierze bardzo poważnie. – Jlaud

+0

Można naśladować sposób, w jaki Spring formatuje liczby i daty z adnotacjami - 'AnnotationFormatterFactory'. http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/org/springframework/format/AnnotationFormatterFactory.html –

Odpowiedz

2

W naszej aplikacji używamy do tego klasy PropertyEditorSupport. Prosty przykład do obsługi kalendarza, ale można użyć dla każdej klasy niestandardowej, po prostu zastąpić getAsText() i setAsText() metod:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Calendar.class, new PropertyEditorSupport() { 
     @Override 
     public void setAsText(String value) { 
      try { 
       Calendar cal = Calendar.getInstance(); 
       cal.setTime(new SimpleDateFormat("dd-MM-yyyy").parse(value)); 
       setValue(cal); 
      } catch (ParseException e) { 
       setValue(null); 
      } 
     } 

     @Override 
     public String getAsText() { 
      if (getValue() == null) { 
       return ""; 
      } 
      return new SimpleDateFormat("dd-MM-yyyy").format(((Calendar) getValue()).getTime()); 
     } 
    }); 
} 
+0

Tak, jeśli używasz PropertyEditors, to jest to, co powinieneś zrobić. Ale PropertyEditors są stopniowo wycofywane na korzyść Formater. A w przypadku Formater nie jest to możliwe. – Jlaud

+0

Och, nie wiedziałem o stopniowym wycofywaniu PropertyEditors. – Kejml