JAXB—将根元素表示为自定义类型列表

JAXB—将根元素表示为自定义类型列表,jaxb,Jaxb,与Stackoverflow上的问题类似,我也有同样的问题。虽然答案中列出的解决方案对我不起作用 注意:我使用Jackson fasterxml库进行映射 本质上,我使用的是API(recurly API)中的一些XML。API返回的其中一条消息的根元素为列表,演示如下: <plans type="array"> <plan href="..."> ... </plan> <plan href="...">

与Stackoverflow上的问题类似,我也有同样的问题。虽然答案中列出的解决方案对我不起作用

注意:我使用Jackson fasterxml库进行映射

本质上,我使用的是API(recurly API)中的一些XML。API返回的其中一条消息的根元素为列表,演示如下:

<plans type="array">
    <plan href="...">
    ...
    </plan>
    <plan href="...">
    ...
    </plan>
</plans>

现在可以了。

默认情况下,您应该为属性添加注释。我已经尽可能简化了映射

package forum11748159;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Plans extends RecurlyObject {

    private List<Plan> plans;

    @XmlElement(name = "plan")
    public List<Plan> getPlans() { return this.plans; }

    public void setPlans(final List<Plan> plans) { this.plans = plans; }

}

注意:我使用Jackson fasterxml库进行映射


Jackson提供了一些对JAXB注释的支持,但据我所知,它不是一个兼容的实现。不能保证按照规范解释JAXB注释。

Hi Blaise-我自己刚刚得出结论,这与使用Jackson有关。如果我使用Jersey客户端进行映射,我可以让它工作。我尝试了你的建议,但得到了同样的结果。我接受这个答案,因为你已经突出了可能的真正问题,那就是我们如何使用杰克逊。干杯
@XmlRootElement(name = "plans")
public class Plans extends RecurlyObject {
    @XmlTransient
    public static final String PLANS_RESOURCE = "/plans";

    @XmlElementWrapper(name = "plans")
    @XmlElement(name = "plan", type = Plan.class)
    private List<Plan> plans;

    public List<Plan> getPlans() { return this.plans; }

    public void setPlans(final List<Plan> plans) { this.plans = plans; }
    ...
}
@XmlRootElement(name = "plans")
public class Plans extends RecurlyObjects<Plan> {
}
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class RecurlyObjects<T extends RecurlyObject> extends ArrayList<T> {
}
package forum11748159;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Plans extends RecurlyObject {

    private List<Plan> plans;

    @XmlElement(name = "plan")
    public List<Plan> getPlans() { return this.plans; }

    public void setPlans(final List<Plan> plans) { this.plans = plans; }

}
package forum11748159;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "plans")
@XmlAccessorType(XmlAccessType.FIELD)
public class Plans extends RecurlyObject {

    @XmlElement(name = "plan")
    private List<Plan> plans;

    public List<Plan> getPlans() { return this.plans; }

    public void setPlans(final List<Plan> plans) { this.plans = plans; }

}