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

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

@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绑定。
  • 而不是@XmlElementRef / @XmlMixed组合。
  • 但是,为了保持一致,我将字符串转换为Object,以便它与方法的参数类型相匹配。

    当你将它投射到物体上时,你认为发生了什么? :)


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

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

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

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

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

    链接地址: http://www.djcxy.com/p/51719.html

    上一篇: How to remove xmlns:xsi and xsi:type from JAXB marshalled XML file

    下一篇: How to override camelcase on root types in CXF (wadl2java)