JAXB 异常消息:如何更改语言?
JAXB exception messages: How to change language?
在使用 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;
}
这是事件处理程序的输出示例:
XML validation failure in line 8, column 48: cvc-maxInclusive-valid: Wert "10000" ist nicht Facet-gültig in Bezug auf maxInclusive "8.0E3" für Typ "Type".
XML validation failure in line 17, column 64: Ungültiger Wert 250 für Feld Day.
XML validation failure in line 17, column 64: cvc-datatype-valid.1.2.1: "2014-02-2501:00:00Z" ist kein gültiger Wert für "dateTime".
好的,我发现用于 JAXB 事件消息的语言是由 java 系统 属性 user.language
决定的。因此,默认语言取决于它 运行 所在的系统。
我通过添加 -Duser.language=en
更改了 java 程序的 运行 配置。这将 JAXB 事件消息的语言更改为英语。
您应该使用验证器来验证,而不是解组器。您可以像这样更改其语言环境:
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
包。有关详细信息,请参阅 。
在使用 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;
}
这是事件处理程序的输出示例:
XML validation failure in line 8, column 48: cvc-maxInclusive-valid: Wert "10000" ist nicht Facet-gültig in Bezug auf maxInclusive "8.0E3" für Typ "Type". XML validation failure in line 17, column 64: Ungültiger Wert 250 für Feld Day. XML validation failure in line 17, column 64: cvc-datatype-valid.1.2.1: "2014-02-2501:00:00Z" ist kein gültiger Wert für "dateTime".
好的,我发现用于 JAXB 事件消息的语言是由 java 系统 属性 user.language
决定的。因此,默认语言取决于它 运行 所在的系统。
我通过添加 -Duser.language=en
更改了 java 程序的 运行 配置。这将 JAXB 事件消息的语言更改为英语。
您应该使用验证器来验证,而不是解组器。您可以像这样更改其语言环境:
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
包。有关详细信息,请参阅