2012-05-08 19 views
5

Utknąłem i potrzebuję pomocy z zewnątrz od ekspertów JSF z następującym problemem: Zdefiniowałem niektóre konwertery w pliku faces-config.xml dla konkretnych klas, więc nie mam aby cały czas używać atrybutu lub znacznika konwertera. Na przykład:Pobierz Konwerter JSF dla klasy w ManagedBean (JSF 1.2)

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

Teraz istnieje potrzeba robota dla JSF-Component (głównie bogata: extendedDataTable), która buduje całe drzewo komponentów i konwertuje poziom po poziomie do CSV, HTML lub cokolwiek może być potrzebna później na. Mianowicie ogólny sposób eksportowania do pliku CSV, HTML ... bez potrzeby wdrażania go za każdym razem od nowa. To jest prawie gotowe (dzięki wielkiej idei starym kolegą z kopalni) i działa świetnie z wyjątkiem jednej części:

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

To polecenie pobiera wartość o godz: outputText i konwertuje go na String. Ta ostatnia linia jest tym, co chcę zastąpić konwerterem klasy, jeśli istnieje niestandardowy konwerter dla określonego wyrażeniaResult. Nie mogę dowiedzieć się, jak znaleźć ten dokładny konwerter dla moich klas (jak określono przez faces-config). FaceContext nie wydaje się posiadać żadnej użytecznej metody/obiektu dla mojego przypadku użycia. Uzyskanie dostępu do pliku faces-config.xml wydaje się błędne. Prawidłowe podejście może wyglądać:

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

Byłoby dość łatwe, jeśli użyłem konwertera id i odpowiedni atrybut/znacznik do siebie elementów, ale naprawdę chcę, aby uniknąć tego rodzaju bezużytecznym dodatkowego kodu.

Czy ktoś może mi pomóc?

Odpowiedz

8

Poszukujesz 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

Dziękuję bardzo! Właśnie tego szukałem :) Szkoda, że ​​nie było użyteczne JavaDoc w klasach JSF. To z pewnością ułatwiłoby mi życie. –

+0

Tekst 'Application # createConverter()' w mojej odpowiedzi łączy się z javadoc. – BalusC