2013-08-28 27 views
6

JSP sayfalarında, GET parametrelerini dönüştürme ve doğrulamadan sonra ilgili yönetilen fasulye'ye ayarlayan biretiketine sahibim.<f:viewParam> Doğrulama/dönüştürme hataları <f: yerel görünümü> yerelleştirmez, ancak varsayılan olarak yerel ayarı

Dönüştürme veya doğrulama hataları oluşursa, uygun bir hata iletisi kaynak paketinden alınır ve <p:messages> (<p:growl> veya <h:messages> da olabilir) görüntülenir.

Uygulama çok dillidir. Bu nedenle, farklı bir dil seçildiğinde, bu dilde bir mesaj görüntülenmeli, ancak her zaman mesajı varsayılan yerel ayar en'a (İngilizce için) göre görüntüler.

Test.xhtml:

<!DOCTYPE html> 
<html lang="#{localeBean.language}" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

    <f:view locale="#{localeBean.locale}"> 
     <f:metadata> 
      <f:viewParam name="id" converter="#{myConverter}" /> 
     </f:metadata> 
     <h:head> 
      <title>Test</title> 
     </h:head> 
     <h:body> 
      <h:messages /> 
     </h:body> 
    </f:view> 
</html> 

dönüştürücü: <f:viewParam> gelen mesajlar hariç

@FacesConverter("myConverter") 
public final class MyConverter implements Converter 
{ 
    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
    { 
     ResourceBundle bundle = context.getApplication() 
      .evaluateExpressionGet(context, "#{messages}", ResourceBundle.class); 
     String message = bundle.getString("id.conversion.error"); 
     throw new ConverterException(
      new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null)); 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) 
    { 
     throw new UnsupportedOperationException(); // Not relevant in this problem. 
    } 
} 

, sorun yoktur. Diğer tüm mesajlar, kullanıcı tarafından seçilen dilde görüntülenir.

ile ilgili özel bir şey var mı?

cevap

5

Sorununuzu yeniden üretebilirim. Hem Mojarra 2.1.25 hem de MyFaces 2.1.12 aynı sorunu ortaya çıkarmaktadır. Bu yüzden, bu JSF uygulamasında bir hata mı, yoksa JSF spesifikasyonunda bir gözetim olup olmadığından emin değilim. Şimdiye kadar, render yanıtı fazı girilmeden önce bir GET isteği için viewroot yerel ayarının ayarlanmadığı ortaya çıkıyor. Dönüştürücü, doğrulama yanıtı öncesinde, yanıt vermeden çok önce çalışır, bunun yerine neden varsayılan yerel ayarı aldığını açıklar. Daha sonra araştırmam gerekiyor ve gerekirse bir sorunu Mojarra'ya bildirmeliyim. Bu arada

, bu sorunu çözmek için en iyi bahis yerine EL-değerlendirmenin şöyle demet elde etmektir <resource-bundle><var>:

String basename = "com.example.i18n.message"; // Exactly the same as <resource-bundle><base-name> 
Locale locale = context.getApplication().evaluateExpressionGet(context, "#{localeBean.locale}", Locale.class); 
ResourceBundle bundle = ResourceBundle.getBundle(basename, locale); 
// ... 

Güncelleme: Ben issue 3021 bildirdik Bu sorun başına. Başımın bu noktada söylediklerinin etrafına dolamıyorum ama uygulamanın davranışını anlamsız buluyorum.


Güncelleme 2: Mojarra ve MyFaces çocuklar bu karar verdiler. Mojarra için, 2.2.5'e göre fixed oldu (2.1.x backport yok mu?) Ve MyFaces için 2.0.19, 2.1.13 ve 2.2.0'a göre fixed oldu.

+0

Bu yöntemi 'assessmentExpressionGet (String expression)' göremiyorum. Sadece "public T assessmentExpressionGet (FacesContext içeriği, String ifadesi, Class expectedType) yerine ELException" ifadesini görebiliyorum. Orada mı? – Tiny

+0

Maalesef, aşırı basitleştirilmiş bir örnek yayınladım (aslında, org.omnifaces.util.Faces' den statik bir içe aktarma kullanıyordum) ve yanlış bir şekilde yöntemin işiyle ilgili ipucunu anlayacağınızı varsaymıştım. Cevabı güncelledim. – BalusC

+0

Görünüm meta verileri işlendiğinde, dış f: görünüm etiketi dikkate alınmaz, ancak teorik olarak böyle olmamalı, çünkü f: görünüm özel bir şeydir. Bana bir böcek gibi görünüyor. – lu4242