如何从JAXB编组的XML文件中删除xmlns:xsi和xsi:type

我有一组JAXB生成的类,有些类有setter方法,它接受“Object”作为参数。 例如:

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="Car", propOrder = { "defaultCar" } public class Car { @XmlElement(name = "DefaultCar") protected Object defaultcar; public void setDefaultCar(Object value) { this.defaultCar = value; } 

在我的代码中创建了这些类的实例后,我调用setter方法传递所需的值。 虽然方法的参数是Object,但值很可能是字符串(我无法控制它的定义方式)。 但是,为了保持一致,我将字符串转换为Object,以便它与方法的参数类型匹配。 代码看起来像这样:

  Object value = "Old Banger"; Method method = aCar.getClass().getMethod("setDefaultCar", Object.class); method.invoke(aCar, value); 

当我编写Java对象时,我在结果XML中得到以下内容,就在字符串的值前面:

  xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”xsi:type =“xs:string” 

我已经读过某个地方关于方法的参数类型和传递给它的内容之间的数据类型不匹配的地方。 在我的情况下,方法参数是“对象”,但我传入一个字符串给它(虽然我把它转换为对象)。 我也看过这篇文章,看起来和我的问题类似:

JAXB在生成的xml中使用“xsi:type”和“xmlns:xsi”

但是,它并没有帮助我克服我的问题。 有没有办法删除这些对xmlns的引用:xsi和xsi:type?

谢谢

如果您的数据指定的是除模型之外的其他类型,则JAXB将导出xsi:type 。 在您的情况下,您设置一个字符串,但该字段是Object 。 因此,您的数据类型与您的模型不同。 行为是正确的。

你如何解决这个问题。 您已将属性的类型与数据类型对齐。 有很多方法可以实现这一目标:

  • 使它成为String ,为什么它首先是一个Object
  • 更新:您可以使用jaxb:javaType绑定。
  • insteadse @XmlElementRef / @XmlMixed combo。

但是,为了保持一致,我将字符串转换为Object,以便它与方法的参数类型匹配。

当你将它转换为对象时,你认为字符串会发生什么? 🙂

您始终可以使用@XmlElement批注上的type参数覆盖属性类型。

  @XmlElement(name = "DefaultCar", type=String.class) protected Object defaultcar; 

我有类似的问题。 我将带有这些属性的XML发送给一些无法处理它的WS。 我记得我使用Apache CXF发送这个XML所以我最终得到了CXF拦截器来处理这些属性的删除。

遗憾的是,我没有找到一种方法如何在JAXB中直接“禁用”这些属性的生成。 您可以做什么(可能是解决问题的唯一方法)是您使用生成的XML并使用另一个(DOM / SAX)API再次处理它并手动删除属性。 这绝对不是一个很好的解决方案,但我不确定你是否找到了更好的: – /

如果有人给你一个更好的答案我会很高兴…