Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB异常消息:如何更改语言?_Java_Xml_Jaxb_Internationalization_Jaxb2 - Fatal编程技术网

Java JAXB异常消息:如何更改语言?

Java JAXB异常消息:如何更改语言?,java,xml,jaxb,internationalization,jaxb2,Java,Xml,Jaxb,Internationalization,Jaxb2,在使用JAXB对XSD文件进行XML验证期间,如果XML文件无效,我会得到JAXBExceptions。我通过调用event.getMessage()来获取异常消息。生成的字符串是德语 我正在使用JAXB2.2。在德国系统上使用Java8 什么决定了JAXB异常消息的语言以及如何将其更改为英语? 代码如下: SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); tr

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

我正在使用JAXB2.2。在德国系统上使用Java8

什么决定了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". 第8行第48列XML验证失败:cvc maxInclusive有效:Wert“10000”是Bezug auf maxInclusive“8.0E3”für Typ“Type”中的nicht Facet-gültig。 第17行第64列的XML验证失败:Ungültiger Wert 250 für Feld Day。
第17行第64列的XML验证失败:cvc数据类型有效。1.2.1:“2014-02-2501:00:00Z”是kein gültiger Wert für的“dateTime”。OK,我发现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上下文设置语言环境,而不更改整个JVM的默认语言环境?我在创建JAXBContext时尝试设置属性“”,但这会引发异常。它不会传播到底层SaxParser。@fuemf5,请参阅我的答案。