JAXB自定义验证器

时间:2013-12-14 22:22:51

标签: java xml validation jaxb xsd

我有这样的方法:

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类。

1 个答案:

答案 0 :(得分:0)

我想如果验证规则不能在xsd中描述,那么它就超出了JAXB的范围。但是,如果在根据类获取自定义验证器对象时设计结构,则可以在方法末尾添加该逻辑以保持其封装质量。