java - 如何在不编码的情况下验证 JAXB 2.0 中的模式?

标签 java jaxb

我需要在编码到 XML 文件之前验证我的 JAXB 对象。在 JAXB 2.0 之前,可以使用 javax.xml.bind.Validator。但这已被弃用,所以我试图找出正确的方法。我熟悉在编码(marshal)时间进行验证,但就我而言,我只想知道它是否有效。我想我可以编码到一个临时文件或内存并将其丢弃,但想知道是否有更优雅的解决方案。

最佳答案

首先,javax.xml.bind.Validator 已被弃用,取而代之的是 javax.xml.validation.Schema (javadoc)。这个想法是您通过 javax.xml.validation.SchemaFactory ( javadoc ) 解析您的架构,并将其注入(inject)编码器/解码器。

至于您关于没有编码的验证的问题,这里的问题是 JAXB 实际上将验证委托(delegate)给 Xerces(或您正在使用的任何 SAX 处理器),并且 Xerces 将您的文档作为 SAX 事件流进行验证。因此,为了验证,您需要执行一些类型的编码。

影响最小的实现是使用 SAX 处理器的“/dev/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。

关于java - 如何在不编码的情况下验证 JAXB 2.0 中的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1560422/

相关文章:

java - Applet 在 Tomcat 中不显示来自 URL 的图像

java - 如何在运行时从 json 数组中删除完整条目

java - 使用 JMockit 模拟

Java:如何在 OS X Lion 中获取滚动方法?

java - 将 XML 属性解码为对象值

Java 反射与抽象类

java - JAXB - 无法获取某些对象信息

java - 使用附件调用 Web 服务

java - 如何防止 JAXB 在编码时绑定(bind) @XmlRootElement 的父类(super class)方法?

java - 如何在 Java 中存储对类的引用?