2012-04-12 8 views
5

Mi piacerebbe sapere qualcosa sui modelli di supporto del wicket con generico. Ho capito i modelli, il modello prop e il modello composito del prop.Come i modelli di Wicket funzionano con generici?

Ma per quanto riguarda la classe del modello? Cosa succede se faccio questo:

Label<Person> label = new Label<Person> ("someID", new Model<Person>()) 

Cosa verrà mostrato in quell'etichetta? output toString?

Diciamo che ho lo stesso in un campo di testo. Quale valore verrà impostato in quell'oggetto?

+2

Perché non ci provi? – bert

risposta

7

Il codice sorgente di Wicket è molto ben documentato e autoesplicativo. Label sta usando getDefaultModelObjectAsString() da Component che assomigliano a questo:

// Get converter 
final Class<?> objectClass = modelObject.getClass(); 

final IConverter converter = getConverter(objectClass); 

// Model string from property 
final String modelString = converter.convertToString(modelObject, getLocale()); 

Così qui si può vedere che Wicket utilizza un IConverter per convertire l'oggetto del modello ad un String. Guardando all'implementazione del valore predefinito ConverterLocator vedrai che se non hai registrato alcun IConverter per questo tipo di oggetto, Wicket utilizzerà lo DefaultConverter che utilizza i metodi statici org.apache.wicket.util.lang.Objects per convertire l'oggetto in un String.

Il TextField usa anche una IConverter per convertire l'oggetto in una String e dal String a un oggetto nuovo. La differenza è che Wicket è in grado di convertire sempre una classe sconosciuta in un String usando il metodo toString, ma non nell'altro modo. Pertanto, se desideri utilizzare uno IModel<Person> con un TextField, dovrai registrare la tua implementazione IConverter<Person>.

+3

Quindi riassumendo: usa il metodo 'toString()'. Se vuoi qualcosa di diverso, fornisci il tuo convertitore. – biziclop

Problemi correlati