【问题标题】:XMLSchema namespace is ignored (JAXB unmarshal fails)XMLSchema 命名空间被忽略(JAXB 解组失败)
【发布时间】:2020-12-22 17:49:50
【问题描述】:

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

@XmlAnyElement(lax = true)
protected Object any;

现在,我以前在另一个项目中做过这个,它工作得很好,分两步解组 - 首先做包装器,然后以 Node 访问 any 并将其解组到预期的内容(对于我没有 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 插件的标志,我可以切换以包含它。

【问题讨论】:

    标签: spring kotlin jaxb spring-ws


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 1970-01-01
      • 2010-09-21
      • 2015-11-18
      • 2010-12-24
      • 1970-01-01
      • 2014-11-07
      • 2016-06-24
      • 2023-03-11
      相关资源
      最近更新 更多