Spring RestController忽略Wrapper类中的XmlElement批注

时间:2016-10-09 21:39:19

标签: spring spring-restcontroller

我正在使用Spring 4.x并且我有以下RestController方法,该方法应该返回所有航班的列表

@RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}, method = RequestMethod.GET)
public FlightWrapper returnAllFlights() {
    List<FlightDto> flights = data.findAll();

    return new FlightWrapper(flights);
}

FlightWrapper类看起来像这样(rootElement = flight s element = flight):

@XmlRootElement(name = "flights")
public class FlightWrapper {

    private List<FlightDto> flights;

    public FlightWrapper() {}

    public FlightWrapper(List<FlightDto> flights) {
        this.flights = flights;
    }

    @XmlElement(name = "flight")
    public List<FlightDto> getFlights() {
        return flights;
    }

    public void setFlights(List<FlightDto> flights) {
        this.flights = flights;
    }
}

问题是,当我调用returnAllFlights()时,它将以这种格式返回xml:

<FlightWrapper>
    <flights>
        <flights>
            ....
        </flights>
        <flights>
            ....
        </flights>
    </flights>
</FlightWrapper>

我预计单次航班的标签应为航班,整个航班列表应为航班,但您可以看到列表中的项目与列表本身具有相同的标签。

知道怎么解决吗?

1 个答案:

答案 0 :(得分:5)

根据您的评论,因为您正在使用jackson-dataformat-xml模块,现在将忽略JAXB注释。您必须更新您的班级才能使用这些注释。

@JacksonXmlRootElement(localName="flights")
public class FlightWrapper {

    private List<FlightDto> flights;

    public FlightWrapper() {}

    public FlightWrapper(List<FlightDto> flights) {
        this.flights = flights;
    }

    @JacksonXmlElementWrapper(useWrapping=false)
    @JacksonXmlProperty(localName="flight")        
    public List<FlightDto> getFlights() {
        return flights;
    }

    public void setFlights(List<FlightDto> flights) {
        this.flights = flights;
    }
}

我遇到了与你相同的问题,但通过Spring Framework而不是Spring Boot。但是当jackson-dataformat-xml模块添加到类路径中时会发生这种行为。根据我的经验。