我有一个服务,可以解析 XML 并使用
SAXParseException
(exception.getMessage()
返回相同的值)生成包含解析器错误列表的报告(exception.getLocalizedMessage()
完全一样),可供人类阅读和理解。如何将此异常消息本地化为英语以外的语言?
我找到了解决方案。首先需要从
XMLSchemaMessages.properties
得到Apache Xerces
。我从 http://xerces.apache.org/下载了
Xerces-J-src.2.11.0.tar.gz
,解压并从位置获取此文件:...\src\org\apache\xerces\impl\msg
。
现在将此文件重命名为 XMLSchemaMessages_pl.properties 或您需要的本地化文件并将其放置在类路径中。我在 Maven 中有项目,所以我将此文件放入:
src\main\resources\com\sun\org\apache\xerces\internal\impl\msg
。
仅此而已。对此文件的更改将在异常消息中可见。
根据java doc,您需要扩展
SAXParseException
并覆盖getLocalizedMessage
,默认实现返回与getMessage
相同。
编辑: 您可以为每种语言拥有单独的属性文件,并且在每种语言中您可以拥有
code
和 local message
。
当您提高 SAXParseException
时,根据 locale
和一些 code
,返回适当的 message
。
MySAXParseException ex = new MySAXParseException(<code>);
1.使用xercesImpl依赖
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.2</version>
</dependency>
参见https://mvnrepository.com/artifact/xerces/xercesImpl
将其命名为 XMLSchemaMessages_
3.创建自定义 XSMessageFormatterLocale:
/** Use file XMLSchemaMessages_<lower_case_language_code>.properties,
ex: put file src/main/resources/org/apache/xerces/impl/msg/XMLSchemaMessages_ru.properties for "ru-RU"
final Validator validator = schema.newValidator();
// https://svn.apache.org/repos/asf/xerces/site/trunk/production/xerces2-j/javadocs/xerces2/org/apache/xerces/impl/XMLErrorReporter.html
XMLErrorReporter property = (XMLErrorReporter) validator.getProperty("http://apache.org/xml/properties/internal/error-reporter");
property.putMessageFormatter(XSMessageFormatterLocale.SCHEMA_DOMAIN, new XSMessageFormatterLocale(Locale.forLanguageTag("ru-RU")));
*/
public class XSMessageFormatterLocale extends XSMessageFormatter { // org.apache.xerces.impl.xs.XSMessageFormatter
private final Locale locale;
public XSMessageFormatterLocale(Locale locale) {
this.locale = locale;
}
public String formatMessage(Locale locale, String key, Object[] arguments)throws MissingResourceException {
return super.formatMessage(this.locale, key, arguments);
}
}
4.将 putMessageFormatter 设置到您的 schema.newValidator 中
final Validator validator = schema.newValidator();
// https://svn.apache.org/repos/asf/xerces/site/trunk/production/xerces2-j/javadocs/xerces2/org/apache/xerces/impl/XMLErrorReporter.html
XMLErrorReporter property = (XMLErrorReporter) validator.getProperty("http://apache.org/xml/properties/internal/error-reporter");
property.putMessageFormatter(XSMessageFormatterLocale.SCHEMA_DOMAIN, new XSMessageFormatterLocale(Locale.forLanguageTag("ru-RU")));
validator.validate(...);
利润!