Spring MVC中可通过自定义XmlView继承AbstractView并结合JAXB实现XML视图渲染,需配置ContentNegotiatingViewResolver支持XML格式,配合BeanNameViewResolver和实体类JAXB注解,使控制器返回的模型数据以XML输出,适用于需视图控制的场景。

在Spring MVC中,如果需要返回XML格式的数据给客户端(如浏览器或API调用方),除了使用@ResponseBody直接输出XML内容外,还可以通过配置XmlViewResolver来实现视图级别的XML渲染。这种方式适合需要结构化视图管理、复用模板或与视图技术整合的场景。
启用XmlViewResolver的前提条件
Spring本身并不直接提供名为 XmlViewResolver 的标准视图解析器,但可以通过继承 AbstractView 并结合 JAXB 实现自定义XML视图功能。常见的做法是使用 ContentNegotiatingViewResolver 配合自定义XML视图类,实现对不同格式(如JSON、XML)的自动切换。
若你希望基于XML模板或对象自动序列化为XML响应,可以按以下方式配置:
步骤一:添加JAXB依赖(Java 11+需注意模块化)
如果你使用的是Java 8,JAXB已内置;Java 9及以上版本需显式引入:
步骤二:创建支持XML输出的视图类
编写一个继承 AbstractView 的类,用于将模型数据以XML格式输出:
public class XmlView extends AbstractView {@Override
protected void renderMergedOutputModel(Map
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Object obj = model.get("content");
if (obj == null) {
response.setStatus(HttpServletResponse.SC_NO_CONTENT);
return;
}
response.setContentType("application/xml;charset=UTF-8");
JAXBContext context = JAXBContext.newInstance(obj.getClass());
context.createMarshaller().marshal(obj, response.getOutputStream());
}
}
步骤三:配置ViewResolver支持XML视图
在Spring MVC的配置文件(如 dispatcher-servlet.xml)中注册视图解析器:
同时确保开启 BeanNameViewResolver,它允许Spring根据bean名称查找视图实例。
步骤四:控制器返回视图名称
在Controller中返回逻辑视图名,并把要序列化的对象放入model:
@Controllerpublic class UserViewController {
@GetMapping(value = "/user", produces = "application/xml")
public String getUser(Model model) {
User user = new User("zhangsan", 25);
model.addAttribute("content", user);
return "xmlView"; // 对应XmlView的bean名称
}
}
记得在Spring上下文中注册该视图bean:
实体类添加JAXB注解
确保你的Java对象支持JAXB序列化:
@XmlRootElement(name = "user")public class User {
private String name;
private int age;
public User() {}
public User(String name, int age) { this.name = name; this.age = age; }
@XmlElement
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@XmlElement
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
访问 /user.xml 或设置Accept头为 application/xml 即可看到XML输出:










