Skip to content

RSS 与 Atom

Spring Web MVC 提供了对 RSSAtom 摘要(Feeds)的内置支持。它基于 ROME 项目,允许你通过简单的视图类来生成这些 XML 格式的数据。

注意

从 Spring Framework 7.0 开始,org.springframework.web.servlet.view.feed 包中的内置视图类(如 AbstractRssFeedView)已被弃用。官方建议通过自定义视图类型或在 Web 处理器(Handler)中直接渲染来代替。

核心组件

生成的 Feed 视图主要通过继承以下抽象类实现:

  1. AbstractAtomFeedView: 用于生成 Atom 摘要。
  2. AbstractRssFeedView: 用于生成 RSS 2.0 摘要。

两者都继承自 AbstractFeedView

实现示例 (基于 ROME)

在使用这些视图之前,你需要确保项目中包含 ROME 库的依赖。

1. 创建 RSS 视图类

你需要实现 buildFeedMetadata 来设置 Feed 的基本信息,以及 buildFeedItems 来填充具体内容。

java
public class MyRssView extends AbstractRssFeedView {

    @Override
    protected void buildFeedMetadata(Map<String, Object> model, Channel feed,
            HttpServletRequest request) {
        feed.setTitle("Spring 官方新闻");
        feed.setDescription("来自 Spring 社区的最新动态");
        feed.setLink("https://spring.io");
    }

    @Override
    protected List<Item> buildFeedItems(Map<String, Object> model,
            HttpServletRequest request, HttpServletResponse response) {
        
        List<Item> items = new ArrayList<>();
        Item item = new Item();
        item.setTitle("Spring Framework 7.0 发布");
        item.setLink("https://spring.io/blog/7.0");
        items.add(item);
        
        return items;
    }
}
kotlin
class MyRssView : AbstractRssFeedView() {

    override fun buildFeedMetadata(model: Map<String, Any>, feed: Channel, 
                                 request: HttpServletRequest) {
        feed.title = "Spring 官方新闻"
        feed.description = "来自 Spring 社区的最新动态"
        feed.link = "https://spring.io"
    }

    override fun buildFeedItems(model: Map<String, Any>, request: HttpServletRequest, 
                               response: HttpServletResponse): List<Item> {
        val item = Item().apply {
            title = "Spring Framework 7.0 发布"
            link = "https://spring.io/blog/7.0"
        }
        return listOf(item)
    }
}

2. 控制器映射

控制器负责返回该视图的实例或逻辑名称。

java
@GetMapping("/rss")
public View getRssFeed() {
    return new MyRssView();
}

现代方案:直接渲染 (Direct Rendering)

由于 Spring 7.0 弃用了上述视图类,现在更推荐的做法是在控制器中通过 HttpMessageConverter 直接生成内容,这通常配合 ROME 提供的序列化能力。

java
@GetMapping(value = "/feed/atom", produces = MediaType.APPLICATION_ATOM_XML_VALUE)
@ResponseBody
public SyndFeed getAtomFeed() {
    SyndFeed feed = new SyndFeedImpl();
    feed.setFeedType("atom_1.0");
    feed.setTitle("我的博客");
    // ... 添加内容
    return feed;
}

补充教学

1. 什么是 RSS 和 Atom?

它们都是基于 XML 的内容同步协议。

  • RSS (Really Simple Syndication): 历史更为悠久,简单直观,被大多数阅读器支持。
  • Atom: 设计更晚,试图解决 RSS 规范的不一致性问题,功能更强大(支持更复杂的元数据和内容类型)。

2. 为什么在 MVC 中处理?

虽然可以用简单的字符串模版生成 XML,但使用 Spring 视图或 ROME 对象可以确保生成的 XML 符合规范,并能自动处理字符编码、Media Type(application/rss+xml)等 HTTP 细节。

3. 内容协商 (Content Negotiation)

你可以配置 Spring,使同一个 URL 根据扩展名返回不同的视图。

  • /news.html -> 返回网页视图。
  • /news.rss -> 返回 RSS 视图。
  • /news.atom -> 返回 Atom 视图。 这通过 ContentNegotiationManager 进行统一管理,是构建多端兼容应用的常用手段。

Based on Spring Framework.