微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XMLSchema 命名空间被忽略JAXB 解组失败

如何解决XMLSchema 命名空间被忽略JAXB 解组失败

我正在尝试解组我没有完整定义的复杂有效负载(只是包装器,然后将实际变化的内容定义为

@XmlAnyElement(lax = true)
protected Object any;

现在,我之前在另一个项目中做过这个,它工作得很好,分两步解组 - 首先做包装,然后访问 any 作为 Node 并将其解组到预期的内容(我没有 xsd,我不得不手动建模到类中)

然而,这一次,内容返回命名空间,我让它工作的唯一方法是将命名空间添加到我所有的 XmlRootElementXmlElementXmlType自己的模型结构。显然,这是一个巨大的痛苦,我尝试向包含映射 Xml 负载的域对象的包添加一个 XmlSchema,但由于某种原因,解组器没有选择它。

@javax.xml.bind.annotation.XmlSchema(namespace = "http://mynamespace.com",elementFormDefault = XmlNsForm.QUALIFIED)
package com.myproject.schema;

我试过用多种方式创建解组器,没有一个选择包中的 XmlSchema

val marshaller = Jaxb2Marshaller()
marshaller.setPackagesToScan("supplier.package","com.myproject.schema")

val unmarshaller = JAXBContext.newInstance(myKClass.java).createUnmarshaller()

我的(相关)依赖看起来像这样

implementation("org.springframework.boot:spring-boot-starter-webflux:2.4.1")
implementation("org.springframework.ws:spring-ws-core:3.0.10.RELEASE")
implementation("javax.xml.bind:jaxb-api:2.3.1")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.10.1")

编辑: 显然,包级注释没有被读取,因为 package-info.java 文件似乎被排除在构建之外(因此它没有被类加载器接收)。我查看了从 xjc 输出构建的类,这些类确实包含包信息。

我仍在研究为什么会发生这种情况,也许 Gradle 或 Kotlin 插件一个标志,我可以切换以将其包含在内。

解决方法

问题确实由包级 XmlSchema 注释修复。但是,必须检查它是否在类加载时确实被拾取(反射是您的朋友),如果没有,请记住 package-info.java 文件必须放在您的 Java 源代码中,而不是您的 Kotlin 源代码中(看起来很明显,但当你在兔子洞里呆几个小时时,它并不总是那么明显)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。