spring - XMLSchema 命名空间被忽略(JAXB 解组失败)
问题描述
我正在尝试解组一个我没有完整定义的复杂有效负载(只是包装器,然后将实际变化的内容定义为
@XmlAnyElement(lax = true)
protected Object any;
现在,我之前在另一个项目中做过这个,它工作得很好,分两步解组 - 首先做包装器,然后any
作为 a访问并将其Node
解组到预期的内容(为此我没有 xsd,我不得不手动建模成类)
然而,这一次,内容以命名空间返回,我让它工作的唯一方法是将命名空间添加到每个XmlRootElement
,XmlElement
以及XmlType
我自己的所有建模结构中。显然这是一个巨大的痛苦,我试图在XmlSchema
包含映射 Xml 有效负载的域对象的包中添加一个,但由于某种原因,解组器没有拾取它。
@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 源中(看起来很明显,但它是当你在兔子洞里呆了几个小时时,并不总是那么明显)。