我有这样的方法:
private static <T> T readXML(final String file, final String schemaFile, final Class<T> clazz) {
try {
final JAXBContext context = JAXBContext.newInstance(clazz);
final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new EventHandler());
final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final String directory = System.getProperty("schema.dir");
unmarshaller.setSchema(schemaFactory.newSchema(new File(directory, schemaFile)));
return clazz.cast(unmarshaller.unmarshal(new File(directory, file)));
} catch (final Exception ex) {
ex.printStackTrace();
}
System.exit(1);
return null;
}
我这样用它:
private static final Primitives primitives = readXML("primitives.xml", "primitives.xsd", Primitives.class);
我的问题是,是否可以向unmarshaller添加自定义验证器? 我的意思是假设我有一个名为Foo的complexType。我想对它做一些我无法在xsd文件中描述的验证,所以我想做这样的事情:
unmarshaller.setCustomValidator(Foo.class, new MyCustomValidator());
每次JAXB读取Foo时都会调用MyCustomValidator。 或者,如果我无法在xsd文件中描述某些验证,那么在JAXB读取完成后我必须验证已解析的类?
哦,顺便说一句......我用xjd从xjc生成了JAXB类。
答案 0 :(得分:0)
我想如果验证规则不能在xsd中描述,那么它就超出了JAXB的范围。但是,如果在根据类获取自定义验证器对象时设计结构,则可以在方法末尾添加该逻辑以保持其封装质量。