Java 本地化异常(在Struts2应用程序中)

Java 本地化异常(在Struts2应用程序中),java,internationalization,struts2,Java,Internationalization,Struts2,我正在开发一个支持多种语言的Struts 2应用程序。如果某个域对象需要抛出异常,它如何能够以错误消息不特定于语言的方式抛出异常?以后如何根据当前区域设置显示该异常 我最初在寻找一种在抛出错误消息时本地化错误消息的方法,但意识到这不是最好的方法,因为(a)它在业务模型和web框架之间引入了不必要的依赖关系;(b)语言应该在异常显示时由当前语言环境决定,而不是在抛出异常时 所以我想知道其他人是如何处理这个问题的。(我不认为这是Struts 2特有的,但与任何多语言应用程序相关)。只需在捕获和处理异

我正在开发一个支持多种语言的Struts 2应用程序。如果某个域对象需要抛出异常,它如何能够以错误消息不特定于语言的方式抛出异常?以后如何根据当前区域设置显示该异常

我最初在寻找一种在抛出错误消息时本地化错误消息的方法,但意识到这不是最好的方法,因为(a)它在业务模型和web框架之间引入了不必要的依赖关系;(b)语言应该在异常显示时由当前语言环境决定,而不是在抛出异常时


所以我想知道其他人是如何处理这个问题的。(我不认为这是Struts 2特有的,但与任何多语言应用程序相关)。

只需在捕获和处理异常的级别,而不是抛出异常的位置,以所需的语言显示错误消息。如果您需要一些额外的信息,如用户名或标识符,只需在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
}

为什么要抛出带有区域设置特定消息的异常?我会让他们一直保持英语。但是,您可以使错误页面特定于区域设置。显示特定于语言环境的消息,说明出现了故障,用户应该做什么,用户可以在下面找到详细信息(在这里插入纯英语错误详细信息)。对于基本验证消息(“这是必需的”、“请输入有效的电子邮件”等),当然要使用特定于区域设置的消息。

我想错误页面需要使用本地化字符串根据区域设置显示错误。 在各自特定于语言环境的文件中定义标准消息,struts 2应根据工作语言环境呈现这些消息。(请参见
s:text
的工作原理)


要定义特定于区域设置的文件并将其放置在应用程序中,请参见

在注意到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框架上业务对象的依赖关系。

我想直接向用户显示异常消息。它用于域对象中的模糊错误,例如“您无法撤回报价,因为它已被批准”。这样的错误不会经常发生,如果发生了,只需告诉用户操作失败并显示异常消息就足够了。可能存在许多错误,但调用者可以以相同的方式处理它们。因此,我不想为每个可能的错误创建异常子类。