Skip to content

XML 编组 (XML Marshalling)

Spring MVC 提供了 MarshallingView,它使用 Spring OXM (Object/XML Mapping) 抽象将模型对象渲染为 XML。

核心概念

与直接使用 Jackson 的 XML 支持不同,MarshallingView 允许你集成多种 XML 编组框架,如 JAXBXStreamCastor 等。这在需要复杂的 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 处理器,请务必手动配置以确保安全性。

Based on Spring Framework.