当前位置: 首页 > 面试题库 >

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

麻宜春
2023-03-14
问题内容

在编组到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中。

关于您的有关不进行编组验证的问题,这里的问题是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。



 类似资料:
  • 问题内容: 我一直在寻找一种不用使用collections.sort就可以对数组列表进行排序的方法,因为我自己的逻辑有缺陷,而且我遇到了很多麻烦。 我需要对它进行排序,以便可以使用我创建的一种方法,该方法基本上可以执行collections.swap的工作,以便对数组列表进行完全排序。 这是我的代码: 我对此一直很烦恼。抱歉,这是在伤害社区。 问题答案: 我想,你希望下面的算法:在阵列的其余部分发

  • 我需要添加多个数组在一起取决于用户的偏好一些数组可能会出现空,我如何确保数组我要Conconat是不是空 这是我失败的代码

  • 问题内容: 在斯威夫特,我怎么能写这样的情况,一个开关语句测试值被切换对抗的内容 可选 ,跳过如果可选包含案例? 这是我想象的样子: 如果我只是这样写,编译器会抱怨没有解包,但是如果我通过添加到末尾来显式解包,那么我当然会在包含的任何时间收到运行时错误。对我来说,添加而不是有意义(我想是基于可选链接的精神),但并不能消除编译器错误(即,实际上并未解开可选)。 问题答案: 可选就像这样: 因此,您可

  • 问题内容: 是否可以不执行而检查bash脚本语法? 使用Perl,我可以运行。bash脚本有任何等效命令吗? 问题答案: 也许是一个明显的警告:这可以验证语法,但不会检查您的bash脚本是否尝试执行不在您的路径中的命令,例如而不是。

  • 问题内容: 我正在使用javax.mail用Java发送邮件。现在,项目概念的一部分已更改,我必须发送未经身份验证的邮件。我将不得不更改我的createSession()方法: 很明显,我应该更改为,但是我还应该更改什么? 问题答案: 我认为,就足够了。

  • 问题内容: 我的应用程序中有此表单,我将通过AJAX提交它,但是我想使用HTML5进行客户端验证。因此,我希望能够通过jQuery强制进行表单验证。 我想触发验证而不提交表单。可能吗? 问题答案: 要检查某个字段是否有效,请使用: 要检查表格是否有效,请使用: 如果要显示某些浏览器具有的本机错误消息(例如Chrome),很遗憾,唯一的方法是提交表单,如下所示: 希望这可以帮助。请记住,并非所有浏览