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 路径时,就会发生这种行为。它根据我的经验。
我正在使用 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 路径时,就会发生这种行为。它根据我的经验。