2012-05-08 16 views
5

Sono bloccato e ho bisogno di aiuto esterno da esperti JSF con il seguente problema: Ho definito alcuni convertitori in faces-config.xml per classi specifiche quindi non ho per usare l'attributo-convertitore o tag tutto il tempo. Per esempio:Fetch JSF Converter per classe in ManagedBean (JSF 1.2)

<converter> 
     <converter-for-class>org.joda.time.DateTime</converter-for-class> 
     <converter-class>com.example.converter.JodaDateTimeConverter</converter-class> 
    </converter> 

Ora non v'è la necessità di un cingolato per un JSF-componente (per lo più ricchi: extendedDataTable) che costruisce tutto l'albero dei componenti e converte livello dopo livello in formato CSV, HTML o qualsiasi altra cosa potrebbe essere necessaria in seguito sopra. Vale a dire un modo generico per esportare in CSV, HTML, ... senza la necessità di implementarlo ogni volta di nuovo. E 'quasi fatta (grazie alla grande idea di un vecchio collega di miniera) e funziona ottimo, tranne per una parte:

Object expressionResult = expression.getValue(FacesContext.getCurrentInstance().getELContext()); 
    expressionResultString = expressionResult.toString(); 

Questo comando recupera il valore di un h: outputText e lo converte in stringa. Quest'ultima riga è ciò che voglio sostituire con il convertitore per la classe se esiste un convertitore personalizzato per un'espressione specificaResult. Non riesco a scoprire come trovare quel convertitore esatto per le mie classi (come specificato da faces-config). Il FacesContext non sembra contenere alcun metodo/oggetto utile per il mio caso d'uso. Accedere direttamente a faces-config.xml sembra essere sbagliato. Un corretto approccio potrebbe essere simile:

Converter converter = magically_fetch_the_correct_converter_for_expressionResult_type; 
    converter.getAsString(FacesContext.getCurrentInstance(), component, 
           expressionResult); 

Sarebbe abbastanza facile se ho usato convertitore-id e l'appropriato attributo/tag per i componenti stessi, ma ho molta voglia di evitare questo tipo di codice aggiuntivo inutile.

Qualcuno può aiutarmi?

risposta

8

Stai cercando Application#createConverter().

Object object = expression.getValue(context.getELContext()); 
Class<?> type = expression.getType(context.getELContext()); 
Converter converter = context.getApplication().createConverter(type); 
String string = converter.getAsString(context, component, object); 
+0

Grazie mille! Era esattamente quello che stavo cercando :) Vorrei che ci fosse un utile JavaDoc nelle classi JSF. Mi renderebbe sicuramente la vita molto più facile. –

+0

Il testo 'Application # createConverter()' nei miei link di risposta a javadoc. – BalusC