Java Jackson XML-使用名称空间前缀反序列化XML

Java Jackson XML-使用名称空间前缀反序列化XML,java,xml,jackson,Java,Xml,Jackson,我正在使用Jackson XML插件(),我不确定它是否受支持,但我想知道是否可以使用名称空间前缀对XML进行序列化和反序列化,如下所示: <name:Foo> <name:Bar> <name:x>x</name:x> <name:y>y</name:y> </name:Bar> </name:Foo> 但是,我找不到一种方法来配置我的POJO以从生成的XML进行反序列化。

我正在使用Jackson XML插件(),我不确定它是否受支持,但我想知道是否可以使用名称空间前缀对XML进行序列化和反序列化,如下所示:

<name:Foo>
  <name:Bar>
    <name:x>x</name:x>
    <name:y>y</name:y>
  </name:Bar>
</name:Foo>
但是,我找不到一种方法来配置我的POJO以从生成的XML进行反序列化。请参见以下示例代码:

public class Bar{
    @JacksonXmlProperty(localName="name:x")
    public String x = "x";
    @JacksonXmlProperty(localName="name:y")
    public String y = "y";
}


尝试运行此测试时出现异常:

Exception in thread "main" java.io.IOException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "name"

这是可以理解的,但我想知道是否有一种方法可以让它与Jackson XML一起工作?

JacksonXmlProperty
注释具有属性
名称空间
。使用它定义
命名空间

public class Bar {
    @JacksonXmlProperty(namespace = "name",localName="x")
    public String x = "x";
    @JacksonXmlProperty(namespace = "name",localName="y")
    public String y = "y";
} 

@JacksonXmlRootElement(namespace = "name", localName = "Foo")
public class Foo {
   private Bar bar;

   @JacksonXmlProperty(namespace = "name", localName = "Bar")
   public Bar getBar() {
      return bar;
   }

   public void setBar(Bar bar) {
      this.bar = bar;
   }
}

虽然这是一篇老文章,但我刚刚遇到了这个问题,与服务调用所需的XML匹配的唯一解决方案是这样的,其中名称空间声明也使用前缀

@JacksonXmlRootElement(localName = "entry")
abstract class BaseEntry implements Serializable { 
    private static final long serialVersionUID = 6835429382441010779L;
    private final String xmlns = "com.foo.bar"; 
    private String type;
    
    protected BaseEntry(String type) {
        this.type = type;
    }

    @JacksonXmlProperty(isAttribute = true)
    public String getType() {
        return type;
    }
    
    @JacksonXmlProperty(localName = "xmlns:ns2", isAttribute = true)
    public String getXmlns() {
        return xmlns;
    }
}
这会产生如下结果:

<entry type="com.foo.bar" xmlns:ns2="com.foo.bar">
...
</entry>

...

使用上述名称空间配置生成以下XML:
xy
-我可以假设这与我之前给出的示例XML同义吗?@jtyler是的,此XML类似于yours@Ilya当前位置我面临着与此问题相同的问题。我也得到了
xy
。这与
如何相同??未添加前缀。你能详细说明一下吗?@SiddharthTrikha我的理解是,要么直接使用xmlns和你所说的名称,这意味着Foo标记是在“name”名称空间中定义的,要么给这个名称空间指定一个别名并像这样使用它
public class Bar {
    @JacksonXmlProperty(namespace = "name",localName="x")
    public String x = "x";
    @JacksonXmlProperty(namespace = "name",localName="y")
    public String y = "y";
} 

@JacksonXmlRootElement(namespace = "name", localName = "Foo")
public class Foo {
   private Bar bar;

   @JacksonXmlProperty(namespace = "name", localName = "Bar")
   public Bar getBar() {
      return bar;
   }

   public void setBar(Bar bar) {
      this.bar = bar;
   }
}
@JacksonXmlRootElement(localName = "entry")
abstract class BaseEntry implements Serializable { 
    private static final long serialVersionUID = 6835429382441010779L;
    private final String xmlns = "com.foo.bar"; 
    private String type;
    
    protected BaseEntry(String type) {
        this.type = type;
    }

    @JacksonXmlProperty(isAttribute = true)
    public String getType() {
        return type;
    }
    
    @JacksonXmlProperty(localName = "xmlns:ns2", isAttribute = true)
    public String getXmlns() {
        return xmlns;
    }
}
<entry type="com.foo.bar" xmlns:ns2="com.foo.bar">
...
</entry>