JAXB封送:如何将异常信息包含到xml输出文件中?

JAXB封送:如何将异常信息包含到xml输出文件中?,jaxb,marshalling,Jaxb,Marshalling,我有一个非常基本的应用程序,它使用JAXB marshaller根据xsd模式验证输入信息。我注册了一个验证事件处理程序,以获取有关异常的信息。我想要实现的是能够将这些信息包含到作为封送处理结果接收的xml输出结构中。我已经在xsd中包含了异常收集部分,现在我可以在遇到异常时实例化相应的异常对象。问题是,考虑到封送过程已经开始,我如何将这个对象附加到JAXB生成的Java对象结构的其余部分?有可能吗?还是应该在封送处理完成后尝试修改xml结果?如有任何建议,将不胜感激。 谢谢 简短回答:不。JA

我有一个非常基本的应用程序,它使用JAXB marshaller根据xsd模式验证输入信息。我注册了一个验证事件处理程序,以获取有关异常的信息。我想要实现的是能够将这些信息包含到作为封送处理结果接收的xml输出结构中。我已经在xsd中包含了异常收集部分,现在我可以在遇到异常时实例化相应的异常对象。问题是,考虑到封送过程已经开始,我如何将这个对象附加到JAXB生成的Java对象结构的其余部分?有可能吗?还是应该在封送处理完成后尝试修改xml结果?如有任何建议,将不胜感激。
谢谢

简短回答:不。JAXB旨在获取对象图并生成XML。它不打算这样做

更详细的回答:您可以在第一次完成JAXB之后将异常表示注入到图中


更详细的回答是:JAX-B有许多插件和定制技术,您可以使用其中的一种。然而,在你的问题的抽象层面上,很难将其概念化

简短回答:不。JAXB旨在获取对象图并生成XML。它不打算这样做

更详细的回答:您可以在第一次完成JAXB之后将异常表示注入到图中


更详细的回答是:JAX-B有许多插件和定制技术,您可以使用其中的一种。然而,在你的问题的抽象层面上,很难将其概念化

有几种方法可以做到这一点:

选项#1-向根对象添加“异常”属性

  • 确保exceptions属性是最后封送的,这可以使用@XmlType注释上的Propoder进行配置
  • 创建保留根对象的验证处理程序
  • 当验证处理程序遇到异常时,将该异常添加到根对象的exceptions属性中
  • 选项#2-使用XMLStreamWriter

  • 创建XMLStreamWriter
  • 写出一个根元素
  • 在封送拆收器上设置验证处理程序,确保它将存储遇到的异常
  • 将根对象封送到XMLStreamWriter
  • 将遇到的个别异常封送到XMLStreamWriter
  • 写出根元素的结束语

  • 有几种方法可以做到这一点:

    选项#1-向根对象添加“异常”属性

  • 确保exceptions属性是最后封送的,这可以使用@XmlType注释上的Propoder进行配置
  • 创建保留根对象的验证处理程序
  • 当验证处理程序遇到异常时,将该异常添加到根对象的exceptions属性中
  • 选项#2-使用XMLStreamWriter

  • 创建XMLStreamWriter
  • 写出一个根元素
  • 在封送拆收器上设置验证处理程序,确保它将存储遇到的异常
  • 将根对象封送到XMLStreamWriter
  • 将遇到的个别异常封送到XMLStreamWriter
  • 写出根元素的结束语

  • 嗨@Blaise,这听起来很有希望(来自你)我读过你们的一些在线手册。您能详细说明一下如何使验证处理程序保持根对象吗?我像这样绑定我的处理程序:marshaller.setEventHandler(newvalidationproblemhandler());IgorMOh和ValidationProblemHandler只是实现ValidationEventHandler的工具。@IgorM-谢谢。您可以执行以下操作:marshaller.setEventHandler(新的ValidationProblemHandler(myRootObject));在每次封送处理操作之前,您需要设置一个新的事件处理程序实例!非常感谢你!唯一的小问题是,出于某种原因,验证器会两次显示相同的错误。现在,我的xml中每个异常都有两个相同的条目。没什么大不了的,但是如果你知道问题是什么,请分享(这是我保证的最后一个问题:)。@IgorM-不知道为什么会出现两次异常。既然这个答案帮助你,请考虑把它标记为“被接受”的答案。嗨,Blaise,这听起来很有前途。我读过你们的一些在线手册。您能详细说明一下如何使验证处理程序保持根对象吗?我像这样绑定我的处理程序:marshaller.setEventHandler(newvalidationproblemhandler());IgorMOh和ValidationProblemHandler只是实现ValidationEventHandler的工具。@IgorM-谢谢。您可以执行以下操作:marshaller.setEventHandler(新的ValidationProblemHandler(myRootObject));在每次封送处理操作之前,您需要设置一个新的事件处理程序实例!非常感谢你!唯一的小问题是,出于某种原因,验证器会两次显示相同的错误。现在,我的xml中每个异常都有两个相同的条目。没什么大不了的,但是如果你知道问题是什么,请分享(这是我保证的最后一个问题:)。@IgorM-不知道为什么会出现两次异常。既然这个答案帮助你,请考虑把它标记为“被接受的”答案。