2013-08-28 4 views
6

변환 및 유효성 검증 후 GET 매개 변수를 해당 관리 Bean에 설정하는 JSF 페이지에 <f:viewParam> 태그가 있습니다.<f:viewParam>의 유효성/변환 오류가 <f : view locale>에 있지만 기본 로케일로 변환되지 않습니다.

변환 또는 유효성 검사 오류가 발생하면 적절한 오류 메시지가 리소스 번들에서 반입되고 <p:messages> (<p:growl> 또는 <h:messages> 일 수 있음)에 표시됩니다.

응용 프로그램이 다국어입니다. 따라서 다른 언어를 선택하면 해당 언어로 메시지가 표시되어야하지만 기본 로케일 en (영문)에 따라 항상 메시지가 표시됩니다.

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> 

컨버터 : <f:viewParam>에서 메시지를 제외하고

@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. 
    } 
} 

는 아무 문제가 없다. 다른 모든 종류의 메시지는 사용자가 선택한 언어로 표시됩니다.

<f:viewParam>과 관련하여 특별한 것이 있습니까?

답변

5

문제점을 재현 할 수 있습니다. Mojarra 2.1.25와 MyFaces 2.1.12 모두 동일한 문제를 드러냅니다. 따라서 이것이 JSF impl의 버그인지 아니면 JSF 스펙의 감독인지 확실하지 않습니다. 지금까지 렌더링 응답 단계가 시작되기 전에 viewroot 로켈이 GET 요청에 대해 설정되지 않았 음이 밝혀졌습니다. 변환기는 렌더링 응답 직전에 유효성 검사 단계에서 실행되므로 대신 기본 로캘이있는 이유를 설명합니다. 나중에 조사해야하며 필요한 경우 Mojarra에게 문제를보고해야합니다. 한편

이 문제를 해결하는 가장 좋은 대신 EL은 - 평가의 다음과 같이 번들을 얻는 것입니다 <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); 
// ... 

업데이트 : 나는대로 issue 3021을보고했습니다 이 문제마다. 이 시점에서 사양이 무엇을 말하고 있는지 계속 머리를 감쌀 수는 없지만 구현의 동작은 직관적이지 않습니다.


업데이트 2은 다음 인 Mojarra와에서 MyFaces 사람은 이것에 동의했다. Mojarra의 경우, 2.2.5 (아직 2.1.x 백 포트가 없습니까?) 당 fixed이었고 MyFaces의 경우 2.037, 2.1.13 및 2.2.0 당 fixed이었습니다.

+0

이 메소드는'evaluateExpressionGet (String expression)'을 볼 수 없습니다. 대신'public T evaluateExpressionGet (FacesContext 컨텍스트, 문자열 표현식, 클래스 expectedType) 만 ELException'을 throw합니다. 거기 있니? – Tiny

+0

죄송합니다, 나는 (실제로는'org.omnifaces.util.Faces'에서 정적 가져 오기를 사용하고 있습니다.) 과도하게 단순화 된 예제를 게시했으며 메소드의 작업에 대한 힌트를 이해할 것이라고 잘못 가정했습니다. 나는 대답을 업데이트했다. – BalusC

+0

보기 메타 데이터가 처리 될 때 외부 f : view 태그는 고려되지 않지만 이론적으로 f : view는 특별한 것이기 때문에 그러지 않아야합니다. 나에게 벌레 같아. – lu4242