在编组到XML文件之前,我需要验证我的JAXB对象。在JAXB 2.0之前,可以使用javax.xml.bind.Validator。但这已被弃用,因此我正在尝试找出执行此操作的正确方法。我熟悉在马歇尔时间进行验证,但就我而言,我只是想知道其是否有效。我想我可以编组到一个临时文件或内存中并扔掉它,但是想知道是否有更优雅的解决方案。
首先,javax.xml.bind.Validator不赞成使用javax.xml.validation.Schema(javadoc)。这个想法是您通过javax.xml.validation.SchemaFactory(javadoc)解析模式,并将其注入到marshaller / unmarshaller中。
javax.xml.bind.Validator
javax.xml.validation.Schema
javax.xml.validation.SchemaFactory
关于您的有关不进行编组验证的问题,这里的问题是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。
DefaultHandler
marshal()