Spring RestController 忽略 Wrapper 中的 XmlElement 注释 Class

Spring RestController ignore XmlElement annotation in Wrapper Class

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

@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 class 看起来像这样 (rootElement = flights 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() 时,它将 return xml 格式为:

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

我预计单个航班应该有标签 flight 并且整个航班列表应该是 flights 但是正如您在列表中看到的项目与列表本身具有相同的标签。

知道如何解决吗?

根据您的评论,因为您使用的是 jackson-dataformat-xml 模块,所以 JAXB 注释现在被忽略了。您必须更新 class 才能使用这些注释。

@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 模块被添加到 class 路径时,就会发生这种行为。它根据我的经验。