2012-05-08 41 views
5

Tôi bị kẹt và cần sự giúp đỡ từ các chuyên gia JSF với vấn đề sau: Tôi đã định nghĩa một số trình biến đổi trong faces-config.xml cho các lớp cụ thể, vì vậy tôi không có để sử dụng thuộc tính chuyển đổi hoặc thẻ mọi lúc. Ví dụ:Lấy JSF Converter cho lớp trong ManagedBean (JSF 1.2)

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

Bây giờ có nhu cầu về một trình thu thập cho một JSF Component (chủ yếu là người giàu: extendedDataTable) trong đó xây dựng cây thành phần toàn bộ và chuyển đổi mức độ sau khi mức độ thành CSV, HTML hoặc bất cứ điều gì có thể là cần thiết sau trên. Cụ thể là một cách chung chung để xuất sang CSV, HTML, ... mà không cần triển khai nó từng lần nữa. Người ta gần như hoàn tất (nhờ vào ý tưởng tuyệt vời của một đồng nghiệp cũ của tôi) và nó làm việc rất tốt ngoại trừ một phần:

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

Đó lệnh lấy giá trị của một h: outputText và chuyển đổi nó để String. Dòng cuối cùng là những gì tôi muốn thay thế bằng trình chuyển đổi cho lớp nếu có một trình biến đổi tùy chỉnh cho một biểu thức cụ thể. Tôi không thể tìm hiểu làm thế nào để tìm thấy rằng chuyển đổi chính xác cho các lớp học của tôi (theo quy định của faces-config). FacesContext dường như không chứa bất kỳ phương thức/đối tượng hữu ích nào cho trường hợp sử dụng của tôi. Việc truy cập trực tiếp faces-config.xml có vẻ không đúng. Một cách tiếp cận đúng có thể giống như thế:

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

Nó sẽ là khá dễ dàng nếu tôi sử dụng chuyển đổi-id và thuộc tính thích hợp/thẻ cho các thành phần tự nhưng tôi thực sự muốn tránh điều đó loại mã bổ sung vô dụng.

Ai đó có thể giúp tôi không?

Trả lời

8

Bạn đang tìm kiếm 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

Cảm ơn bạn rất nhiều! Đó là chính xác những gì tôi đang tìm kiếm :) Tôi ước có JavaDoc hữu ích trong các lớp JSF. Điều đó chắc chắn sẽ làm cho cuộc sống của tôi dễ dàng hơn nhiều. –

+0

Văn bản 'Application # createConverter()' trong câu trả lời của tôi liên kết đến javadoc. – BalusC