在使用JAXB对XSD文件进行XML验证期间,如果XML文件无效,我会得到JAXBExceptions
。我通过调用事件来获取异常信息。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".
您应该使用验证器进行验证,而不是解组。您可以这样更改其区域设置:
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,您需要导出com。太阳组织。阿帕奇。薛西斯。内部的impl
来自java的包。xml
模块通过编译器选项。有关更多详细信息,请参阅此答案。
好的,我发现用于JAXB事件消息的语言由java系统属性用户决定。语言
。因此,默认语言取决于它所运行的系统。
我通过添加-Duser更改了java程序的运行配置。language=en
。这将JAXB事件消息的语言更改为英语。
我有一个典型的具有多种语言(法语、英语和荷兰语)的web应用程序,我正在使用页面卸载触发器来警告用户在离开页面/关闭选项卡/等等时未保存的更改。这个很管用。 我的问题是,在不改变浏览器语言的情况下,我如何改变对话框标题和“离开此页”和“留在此页”两个框的onbeforeunload消息的语言?
我正在创建一个android应用程序,我试图在sqlite数据库中插入值,但当我尝试插入错误的值时,它会显示在终端android.database.sqlite中。SQLiteConstraintException:CHECK constraint失败:但我想toast一条消息。我使用了try-catch块,但它不起作用。 此异常正在进入终端,但我想在try catch块中捕捉该异常:-
问题内容: 我正在按照以下内容进行编写,其中在比较两个Unicode文本的多行块时,我试图产生一个不错的错误消息。进行比较的内部方法会引发一个断言,但是默认的解释对我没有用 我需要在代码中添加如下内容: 我无法弄清楚如何在我捕获的assertionerror中更改打印的错误消息。我总是得到,它仅显示输出的第一行。 如何更改断言消息以打印出我想要的任何内容? 如果相关的话,我正在运行测试。 问题答案
在使用gradle执行特定测试套件的代码时,我得到以下错误。不明白原因。感谢任何帮助。 org.gradle.internal.remote.internal.MessageIOException:无法写入“/127.0.0.1:53644”.在org.gradle.internal.remote.internal.inet.socketconnection.flush(socketconnect
前言 在封装创建request的时候会调用handleProduceResponse(),这个里面会调用 有异常并且可以重试,执行第一个分支,会调用 有异常但是不可以重试,执行第二个分支,会调用
问题内容: 我有一个SOAPMessage对象。我想解析并将其转换为一组Jaxb类。我如何将消息转换为Jaxb可以解组的格式? javax.xml.bind.Unmarshaller.unmarshal(??) 问题答案: SOAP消息的主体包含实际数据及其要解组的位。您可以执行以下操作: