我正在开发支持多种语言的Struts 2应用程序。如果其中一个域对象需要抛出异常,那么它如何以错误消息不是特定于语言的方式执行此操作?以后如何根据当前区域设置显示该异常?
我最初正在寻找一种方法来在错误消息发布时本地化错误消息,但是我意识到这不是最好的方法,因为(a)它在业务模型和Web框架之间引入了不必要的依赖关系; (b)语言应当在显示的情况下由当前语言环境确定,而不是在抛出异常时确定。
所以我想知道其他人是如何解决这个问题的。 (我认为这不是Struts 2特有的,但与任何多语言应用程序相关)。
答案 0 :(得分:2)
在注意到Throwable有一个名为getLocalizedMessage()的方法后,我决定在我的解决方案中使用它。
我的类BusinessException扩展了Exception,它的构造函数接受表示错误的键:
public BusinessException(String key, Object[] arguments) {
this.key = key;
this.arguments = arguments;
this.locale = Locale.getDefault();
}
如您所见,语言环境默认为JVM的默认语言环境。但是,在Web应用程序中,应该使用当前请求的语言环境。因此,BusinessException提供了一个setLocale()方法,该方法应在getLocalizedMessage()之前调用。因此,在Struts2动作中,成语就像:
try {
// call business objects
}
catch(BusinessException be) {
be.setLocale(ActionContext.getContext().getLocale());
addActionError(be.getLocalizedMessage());
return ERROR;
}
对于记录,本地化消息来自异常类的资源包系列:BusinessException.properties等.Struts2应用程序还有一个应用程序范围的资源包,但我决定不使用它来避免依赖通过Web框架上的业务对象。
答案 1 :(得分: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
}
答案 2 :(得分:0)
为什么要使用特定于语言环境的消息抛出异常?我会一直保持英语。但是,您可以使您的错误页面区域设置具体。显示特定于语言环境的消息,指出某些内容已失败以及用户应该做什么以及用户可以在下面找到详细信息(在此处插入纯英语错误详细信息)。对于基本验证消息(“这是必需的”,“请输入有效的电子邮件”,等等)当然使用特定于语言环境的消息。
答案 3 :(得分:0)
我猜错误页面需要使用本地化字符串来根据语言环境显示错误。
在相应的特定于语言环境的文件中定义标准消息,并且struts 2应根据工作区域设置呈现它们。 (了解s:text
如何运作)。
要定义特定于语言环境的文件并将它们放在应用程序的放置位置,请参阅Struts 2 Localization