我有一些带有JAXB注释的类,我创建了一些实例,我需要根据我的XSD文件验证它们。当对象无效时,我应该能够得到错误的细节。
到目前为止,我还没有运气,我知道这个类ValidationEventHandler但是我可以将它与Unmarshaller类一起使用,问题是我必须验证对象而不是原始XML。
我有这段代码:
MyClass myObject = new MyClass();
JAXBContext jaxbContext = JAXBContext.newInstance("x.y.z");
JAXBSource jaxbSource = new JAXBSource(jaxbContext, myObject);
SchemaFactory factory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(getClass().getClassLoader()
.getResourceAsStream("mySchema.xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(jaxbSource);
此代码将起作用,它将验证对象并在消息中引发异常,如下所示:
cvc-pattern-valid:值'12345678901'不是方面有效的 模式'\ d {10}'用于'id'类型。]
问题是我需要特定的细节,使用类似于我必须解析所有消息的字符串。
答案 0 :(得分:0)
您可以在ErrorHandler
上设置Validator
的实例以捕获个别错误:
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(source);
<强> MyErrorHandler 强>
以下是ErrorHandler
界面的示例实现。如果您不重新抛出异常,则验证将继续。
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class MyErrorHandler implements ErrorHandler {
public void warning(SAXParseException exception) throws SAXException {
System.out.println("\nWARNING");
exception.printStackTrace();
}
public void error(SAXParseException exception) throws SAXException {
System.out.println("\nERROR");
exception.printStackTrace();
}
public void fatalError(SAXParseException exception) throws SAXException {
System.out.println("\nFATAL ERROR");
exception.printStackTrace();
}
}
了解更多信息
答案 1 :(得分:0)
I。如果验证复杂的对象层次结构,则可以自己创建Marshaller并设置其侦听器:
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setListener(yourListener);
JAXBSource source = new JAXBSource(marshaller, object);
该侦听器在遍历层次结构时将收到有关对象实例的通知。
II。从另一个答案中添加一个ErrorHandler
。至少在Wildfly 15中,消息如下所示:
cvc-maxInclusive-valid:值“ 360.953674”对于类型“ #AnonType_longitudeGeographicalPosition”的maxInclusive“ 180.0”而言不是有效的。”
cvc-type.3.1.3:元素“经度”的值“ 360.953674”无效。”
因此,您可以解析出元素名称,即有罪的终端字段名称。
III。结合使用I和II进行一些自省,然后可以根据需要重建指向错误字段的完整Java Beans样式路径。