SAXParseException 本地化

问题描述 投票:0回答:3

我有一个服务,可以解析 XML 并使用

SAXParseException
exception.getMessage()
返回相同的值)生成包含解析器错误列表的报告(
exception.getLocalizedMessage()
完全一样),可供人类阅读和理解。如何将此异常消息本地化为英语以外的语言?

java exception
3个回答
4
投票

我找到了解决方案。首先需要从

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

仅此而已。对此文件的更改将在异常消息中可见。


2
投票

根据java doc,您需要扩展

SAXParseException
并覆盖
getLocalizedMessage
,默认实现返回与
getMessage
相同。

编辑: 您可以为每种语言拥有单独的属性文件,并且在每种语言中您可以拥有

code
local message
。 当您提高
SAXParseException
时,根据
locale
和一些
code
,返回适当的
message

MySAXParseException ex = new MySAXParseException(<code>);

0
投票

1.使用xercesImpl依赖

<dependency>
   <groupId>xerces</groupId>
   <artifactId>xercesImpl</artifactId>
   <version>2.12.2</version>
</dependency> 

参见https://mvnrepository.com/artifact/xerces/xercesImpl

2.翻译此文件https://github.com/JetBrains/jdk8u_jaxp/blob/master/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages.properties

将其命名为 XMLSchemaMessages_.properties

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(...); 

利润!

© www.soinside.com 2019 - 2024. All rights reserved.