Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从JAXB封送的XML文件中删除xmlns:xsi和xsi:type_Java_Xml_Eclipse_Jaxb_Moxy - Fatal编程技术网

Java 如何从JAXB封送的XML文件中删除xmlns:xsi和xsi:type

Java 如何从JAXB封送的XML文件中删除xmlns:xsi和xsi:type,java,xml,eclipse,jaxb,moxy,Java,Xml,Eclipse,Jaxb,Moxy,我有一组JAXB生成的类,其中一些类有setter方法,可以接受 “对象”作为参数。例如: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name="Car", propOrder = { "defaultCar" } public class Car { @XmlElement(name = "DefaultCar") protected Object defaultcar; public void setDefa

我有一组JAXB生成的类,其中一些类有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 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" xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“xsi:type=“xs:string” 我在某个地方读过关于方法的参数类型和传递给它的数据类型不匹配的文章。在我的例子中,方法参数是“Object”,但我向它传递了一个字符串(尽管我已将其转换为Object)。我也看过这篇文章,它看起来与我的问题相似:

然而,这并不能帮助我克服我的问题。有没有办法删除对xmlns:xsi和xsi:type的这些引用


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

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


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

JAXB exports
xsi:type
,如果您的数据指定了模型以外的其他类型。在本例中,您设置了一个字符串,但字段是
Object
。因此,数据的类型与模型不同。这种行为是正确的

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

  • 让它成为
    字符串
    ,为什么它首先是
    对象
  • 更新:您可以使用绑定
  • 使用
    @xmlementref
    /
    @XmlMixed
    组合
然而,为了保持一致性,我将字符串强制转换为Object 它与方法的参数类型匹配


将字符串强制转换为对象时,您认为字符串会发生什么变化?:)

始终可以使用
@xmlement
注释上的
type
参数覆盖属性类型

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

Car
类是什么样子的。请编辑您的问题。我确实读过一些论坛,其中提到编写XML过滤器(我想与您所做的类似),但我希望有一个更干净的解决方案THX来确认我对所发生的事情的理解。不幸的是,我无法将类型从Object更改为String,因为已经向我提供了XSD(我确实使用了该方法,并将其更改为accept String,xsi:type就像您所说的那样)。您的第二个建议是否有好的链接,或者这是否也涉及到更改JAXB类?我正在使用Eclipselink MOXy顺便问一下。有什么功能我可以使用吗?当我试着把绳子扔到物体上时,我紧紧抓住吸管,但没有运气@user3572079您不能更改模式,但可以自定义,例如使用
jaxb:javaType
,请参阅更新。Thx Blaise,我向其他与我有类似问题的人阅读了您的解决方案,并认为我也可以使用它。但是,最好不要修改JAXB生成的类,而是在我的程序中对其进行编码。我希望你能回答我的问题,但似乎月食链接MOXy并没有提供任何方法来阻止这种情况发生(