2009-11-13 4 views
1

여러 언어를 지원하는 Struts 2 응용 프로그램을 개발 중입니다. 도메인 객체 중 하나가 예외를 throw해야하는 경우 오류 메시지가 언어별로 표시되지 않도록 어떻게 할 수 있습니까? 그리고 그 예외는 현재 로케일을 기반으로 나중에 어떻게 표시 될 수 있습니까?지역화 된 예외 (Struts2 응용 프로그램 내)

나는 원래 던져진 지점에서 오류 메시지를 현지화하는 방법을 찾고 있었지만 이것이 (a) 비즈니스 모델과 웹 프레임 워크간에 불필요한 종속성을 도입했기 때문에 이것이 최선의 방법이 아니라는 것을 깨달았다. ; (b) 언어가 던져 질 때가 아니라 으로 표시 될 때 현재 지역에 의해 결정되어야합니다.

다른 사람들이이 문제에 어떻게 접근했는지 궁금합니다. (그리고 이것이 Struts 2에만 국한된 것은 아니라고 생각합니다. 그러나 다국어 애플리케이션과 관련이 있습니다.)

답변

0

예외를 포착하고 처리하는 레벨에서 원하는 언어로 오류 메시지를 표시하십시오. 예외를 던지기보다는 예외를 표시하십시오. 사용자 이름이나 식별자와 같은 추가 정보가 필요하면 BusinessException 클래스에 속성을 만들어 표시되는 메시지에서 사용할 수 있도록하십시오.

try { 
    doSomething(); 

} catch (BusinessException e) { 
    LOG.error("Create your error message in English, it's good for logging", e); 

    int id = e.getId(); 
    // internationalize here 
} 
+0

가능한 많은 오류가 있지만 발신자가 모두 동일한 방식으로 처리 할 수 ​​있습니다. 따라서 모든 가능한 오류에 대해 예외 서브 클래스를 생성하고 싶지 않습니다. –

0

왜 로케일 특정 메시지와 함께 예외를 던질 것인가? 나는 그들을 항상 영어로 유지할 것이다. 그러나 오류 페이지 로케일을 특정하게 만들 수 있습니다. 로케일 고유의 메세지를 표시합니다. 메세지에는 무엇인가 실패했는지, 유저가해야 할 것, 유저가 이하에 상세를 여기에 표시 할 수 있는지가 표시됩니다. 기본 유효성 확인 메시지 ("필수 사항", "유효한 전자 메일을 입력하십시오"등)는 물론 로캘 별 메시지를 사용합니다.

+0

예외 메시지를 사용자에게 직접 표시하려고합니다. 그것은 도메인 객체들로부터의 모호한 오류들입니다. "이미 승인 되었기 때문에 제안을 철회 할 수 없습니다."이러한 오류는 자주 발생하지 않으며 사용자가 조작 한 경우 사용자에게 조작이 실패했음을 알리고 예외 메시지를 표시하는 것으로 충분합니다. –

+0

비즈니스 수준 유효성 검사가 이미 적용되어야합니다. – BalusC

0

로캘별로 오류 페이지를 표시하려면 지역화 된 문자열을 사용해야합니다. 표준 메시지를 각각의 로케일 특정 파일로 정의하고 스트럿츠 2는 작업 로케일별로 렌더링해야합니다. (s:text의 작동 방식 참조).

가의 Throwable가로 getLocalizedMessage()라는 메소드를 가지고 있음을 알아 차리지 후 Struts 2 Localization

2

를 참조 응용 프로그램에 넣어하는 로케일 특정 파일과 장소를 정의하려면, 내 솔루션이 사용하기로 결정했다.

내 클래스 BusinessException이 예외를 확장하고, 생성자 오류를 나타내는 키 취

public BusinessException(String key, Object[] arguments) { 
    this.key = key; 
    this.arguments = arguments; 
    this.locale = Locale.getDefault(); 
} 

을 당신이 볼 수 있듯이, JVM의 기본 로케일 로케일 기본 설정됩니다. 그러나 웹 응용 프로그램에서는 현재 요청의 로켈을 대신 사용해야합니다. 따라서 BusinessException은 getLocalizedMessage() 전에 호출해야하는 setLocale() 메소드를 제공합니다. BusinessException.properties 등 Struts2 응용 프로그램도 있습니다 공식적으로

try { 
    // call business objects 
} 
catch(BusinessException be) { 
    be.setLocale(ActionContext.getContext().getLocale()); 
    addActionError(be.getLocalizedMessage()); 
    return ERROR; 
} 

, 지역화 된 메시지는 예외 클래스의 리소스 번들의 가족에게서 온 : 따라서, Struts2 액션의 관용구 같은 것이있다 응용 프로그램 전체 리소스 번들이지만 웹 프레임 워크의 비즈니스 개체에 대한 종속성을 피하기 위해이를 사용하지 않기로 결정했습니다.