首页 > 解决方案 > XMLSchema 命名空间被忽略(JAXB 解组失败)

问题描述

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

@XmlAnyElement(lax = true)
protected Object any;

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

然而,这一次,内容以命名空间返回,我让它工作的唯一方法是将命名空间添加到每个XmlRootElementXmlElement以及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 插件有一个标志,我可以切换以包含它。

标签: springkotlinjaxbspring-ws

解决方案


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


推荐阅读