【问题标题】:JAXB exception messages: How to change language?JAXB 异常消息:如何更改语言?
【发布时间】:2015-07-09 16:38:52
【问题描述】:

在使用 JAXB 对 XSD 文件进行 XML 验证期间,如果 XML 文件无效,我会收到 JAXBExceptions。我通过调用event.getMessage() 得到异常消息。结果字符串是德语。

我正在使用 JAXB 2.2。在德语系统上使用 java 8。

什么决定了 JAXB 异常消息的语言以及如何将其更改为英文?

代码如下:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
    Schema schema = schemaFactory.newSchema();
    JAXBContext jaxbContext = JAXBContext.newInstance("myPackage");
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    unmarshaller.setEventHandler(new XMLValidationEventHandler());
    unmarshaller.setSchema(schema);
    myClass = (myClass) unmarshaller.unmarshal(new File("myFile.xml"));

} catch (SAXException saxE) {
    System.out.println("SAX-Exception during creation of Schema object!");
    saxE.printStackTrace();
} catch (JAXBException e) {}

这是事件处理程序:

public class XMLValidationEventHandler implements ValidationEventHandler {

@Override
public boolean handleEvent(ValidationEvent event) {
    System.out.println("XML validation failure in line " 
                       + event.getLocator().getLineNumber() 
                       + ", column " + event.getLocator().getColumnNumber() 
                       + ": " + event.getMessage());
    return true;
}

这是事件处理程序的输出示例:

第 8 行第 48 列中的 XML 验证失败:cvc-maxInclusive-valid: Wert "10000" ist nicht Facet-gültig in Bezug auf maxInclusive "8.0E3" für Typ "Type"。
第 17 行第 64 列中的 XML 验证失败:Ungültiger Wert 250 für Feld Day。
第 17 行第 64 列中的 XML 验证失败:cvc-datatype-valid.1.2.1: "2014-02-2501:00:00Z" ist kein gültiger Wert für "dateTime"。

【问题讨论】:

  • 请发布用于获取消息的代码示例,并尽可能提供准确的输出。

标签: java xml jaxb internationalization jaxb2


【解决方案1】:

好的,我发现用于 JAXB 事件消息的语言是由 java 系统属性user.language 决定的。因此,默认语言取决于运行它的系统。

我通过添加-Duser.language=en 更改了我的java 程序的运行配置。这将 JAXB 事件消息的语言更改为英语。

【讨论】:

  • 有没有办法只为当前 JAXB 上下文设置语言环境,而不更改整个 JVM 的默认语言环境?我在创建 JAXBContext 时尝试设置属性“apache.org/xml/properties/locale”,但这会引发异常。它不会传播到底层的 SaxParser。
  • @fuemf5,看我的回答。
【解决方案2】:

您应该使用验证器来验证,而不是解组器。您可以像这样更改其语言环境:

import javax.xml.validation.Validator;
import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;
import org.xml.sax.ErrorHandler;

Validator validator = schema.newValidator();
ErrorHandler errorHandler = new YourErrorHandler();
validator.setErrorHandler(errorHandler);

XMLErrorReporter xmlErrorReporter = (XMLErrorReporter) validator
        .getProperty("http://apache.org/xml/properties/internal/error-reporter");
xmlErrorReporter.setLocale(new Locale("ru", "RU"));

尽管使用 Java9+,您需要通过编译器选项从 java.xml 模块导出 com.sun.org.apache.xerces.internal.impl 包。详情请见this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2014-01-14
    • 1970-01-01
    • 2023-01-09
    • 2022-10-16
    相关资源
    最近更新 更多