XML 编组 (XML Marshalling)
Spring MVC 提供了 MarshallingView,它使用 Spring OXM (Object/XML Mapping) 抽象将模型对象渲染为 XML。
核心概念
与直接使用 Jackson 的 XML 支持不同,MarshallingView 允许你集成多种 XML 编组框架,如 JAXB、XStream、Castor 等。这在需要复杂的 XML 映射逻辑或符合特定 XML Schema (XSD) 的场景中非常有用。
配置与使用
1. 配置 Marshaller
你需要在 Spring 容器中定义一个 Marshaller 实例(通常也是 Unmarshaller)。
java
@Configuration
public class MarshallingConfig {
@Bean
public Marshaller jaxbMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// 设置需要绑定的类
marshaller.setClassesToBeBound(User.class, Account.class);
return marshaller;
}
}kotlin
@Configuration
class MarshallingConfig {
@Bean
fun jaxbMarshaller(): Marshaller {
return Jaxb2Marshaller().apply {
setClassesToBeBound(User::class.java, Account::class.java)
}
}
}2. 在控制器中使用
你可以直接创建 MarshallingView 并将其传递给 ModelAndView。
java
@Controller
public class UserController {
@Autowired
private Marshaller marshaller;
@GetMapping("/user/{id}.xml")
public ModelAndView getUserXml(@PathVariable Long id) {
User user = userService.findById(id);
// "user" 是模型中的 Key,MarshallingView 会将其编组为 XML
return new ModelAndView(new MarshallingView(marshaller), "user", user);
}
}自动配置 (可选)
如果你更倾向于根据请求头(Content-Type)自动处理,而不是显式返回 MarshallingView,你可以配置 ContentNegotiatingViewResolver 并通过它分发到 MarshallingView。
补充教学
1. MarshallingView vs @ResponseBody
- @ResponseBody: 这是目前的标准做法,通常配合 Jackson 的 XML 扩展。它更通用,代码侵入性小。
- MarshallingView: 给予你更高的控制权。你可以为不同的视图实例配置不同的
Marshaller,或者在传统的模型驱动型(ModelAndView)架构中使用它。
2. JAXB 性能提醒
JAXB 的上下文初始化较慢。务必将 Jaxb2Marshaller 配置为单例(Singleton),并避免在每个请求中重新创建它。
3. XML 安全 (XXE)
Spring 的 Jaxb2Marshaller 默认已禁用了外部实体解析,以防止 XXE (XML External Entity) 注入攻击。如果你使用自定义的 XML 处理器,请务必手动配置以确保安全性。