2013-08-25 23 views
9

Ho un tipo di dati nella mia applicazione chiamato Foo che sembra qualcosa di simile:Come si configura un formattatore di campo specifico del controllore con Spring MVC?

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

    // unique business key 
    private String businessKey; 

    ... 
} 

Questo tipo è usato in molte forme in tutta l'applicazione web e in genere si desidera convertire avanti e indietro utilizzando la proprietà id quindi ho implementato un formattatore Spring3 che lo fa e ho registrato quel formattatore con il servizio di conversione Spring globale.

Tuttavia, ho un caso di utilizzo di un modulo in cui voglio convertire utilizzando il businessKey. È abbastanza facile implementare un formattatore per farlo, ma come faccio a dire a Spring di usare quel formattatore solo per questo specifico modulo?

Ho trovato un documento in http://static.springsource.org/spring/previews/ui-format.html che ha una sezione sulla registrazione formattatori specifici di campo (vedi 5.6.6 tutto il percorso in basso) che offre questo esempio:

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

Questo è esattamente quello che voglio , ma questo è un documento di anteprima del 2009 e non assomiglia al metodo registerFormatter reso nell'API finale rilasciata.

Come si dovrebbe fare questo?

+2

Sembra non si può, vedere [SPR-7773] (https: //jira.springsource. org/browse/SPR-7773), [SPR-6069] (https://jira.springsource.org/browse/SPR-6069) e [SPR-6015] (https://jira.springsource.org/browse/ SPR-6015) –

+0

Wow, hai ragione. Questa è una buca enorme e a giudicare dalle voci della JIRA, non una che la squadra di primavera prende molto sul serio. – Jlaud

+0

È possibile simulare il modo in cui Spring formatta numeri e date con annotazioni - 'AnnotationFormatterFactory'. http://docs.spring.io/spring/docs/3.1.4.RELEASE/javadoc-api/org/springframework/format/AnnotationFormatterFactory.html –

risposta

2

Nella nostra applicazione, usiamo la classe PropertyEditorSupport per questo. Semplice esempio per la gestione del calendario, ma è possibile utilizzare per qualsiasi classe personalizzata, basta ignorare getAsText() e setAsText() metodi:

@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

Sì, quando usi PropertyEditors questo è quello che dovresti fare. Ma i PropertyEditors sono stati gradualmente eliminati a favore di Formatters. E con Formatters, questo non è possibile. – Jlaud

+0

Oh, non sapevo che i PropertyEditor fossero stati eliminati. – Kejml