Rest接口返回XML集合未正确分组问题咨询
解决REST接口返回XML集合未正确分组的问题
嘿,我看你遇到了REST接口返回XML集合时没有正确分组的问题——应该是返回的XML里一堆<User>标签直接并列在一起,没有外层的包裹节点对吧?这其实是JAXB处理集合时的默认行为导致的,下面给你几个实用的解决办法:
方法一:写个集合包装类(最通用靠谱的方案)
你可以专门定义一个用来包裹User集合的类,给它加上@XmlRootElement作为XML的根节点,再用@XmlElement指定集合里每个元素的标签名:
@XmlRootElement(name = "Users") public class UserList implements Serializable { private static final long serialVersionUID = 1L; private List<User> users; // 空构造方法是JAXB必须的 public UserList() {} public UserList(List<User> users) { this.users = users; } @XmlElement(name = "User") public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } }
之后你的REST接口就返回这个UserList对象,而不是直接返回List<User>。这样输出的XML就会有<Users>作为外层根节点,里面整整齐齐包裹着每个<User>元素,完美实现分组。
方法二:用@XmlElementWrapper注解(适合直接返回集合的场景)
如果你的接口框架支持(比如Spring REST),可以直接在返回集合的方法上或者对应的集合getter方法上加注解,省去写包装类的麻烦:
比如在接口方法上这么加:
@GetMapping(value = "/users", produces = MediaType.APPLICATION_XML_VALUE) @XmlElementWrapper(name = "Users") @XmlElement(name = "User") public List<User> getUsers() { // 这里返回你的User集合 }
或者如果集合是某个类的属性,就在它的getter上加:
@XmlElementWrapper(name = "Users") @XmlElement(name = "User") public List<User> getUsers() { return users; }
方法三:Spring Boot下的全局配置(进阶玩法)
要是你用的是Spring Boot,还可以通过自定义消息转换器来统一处理所有集合的XML包装。不过这个方法相对复杂,前面两种已经能解决大部分场景了,要是你需要统一配置再深入研究也不迟。
调整后你会得到这样的XML
修改完成后,返回的XML结构就会变成规范的分组形式:
<Users> <User> <id>1</id> <name>张三</name> <profession>工程师</profession> </User> <User> <id>2</id> <name>李四</name> <profession>设计师</profession> </User> </Users>
内容的提问来源于stack exchange,提问作者Ascalonian
相关产品推荐
相关产品推荐

