小编典典

如何在不进行编组的情况下针对JAXB 2.0中的架构进行验证?

java

在编组到XML文件之前,我需要验证我的JAXB对象。在JAXB
2.0之前,可以使用javax.xml.bind.Validator。但这已被弃用,因此我正在尝试找出执行此操作的正确方法。我熟悉在马歇尔时间进行验证,但就我而言,我只是想知道其是否有效。我想我可以编组到一个临时文件或内存中并扔掉它,但是想知道是否有更优雅的解决方案。


阅读 222

收藏
2020-09-16

共1个答案

小编典典

首先,javax.xml.bind.Validator不赞成使用javax.xml.validation.Schemajavadoc)。这个想法是您通过javax.xml.validation.SchemaFactoryjavadoc)解析模式,并将其注入到marshaller
/ unmarshaller中。

关于您的有关不进行编组验证的问题,这里的问题是JAXB实际上将验证委托给Xerces(或您使用的任何SAX处理器),并且Xerces将您的文档验证为SAX事件流。因此,为了进行验证,您需要执行
某种 编组。

影响最小的实现是使用SAX处理器的“ / dev / null”实现。编组为null OutputStream仍将涉及XML生成,这很浪费。所以我建议:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(locationOfMySchema);

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setSchema(schema);
marshaller.marshal(objectToMarshal, new DefaultHandler());

DefaultHandler将丢弃所有事件,并且marshal()如果针对架构的验证失败,则该操作将引发JAXBException。

2020-09-16