How to return RSS with REST service?

2.7k views Asked by At

I'm using ROME for RSS feed generating and Jersey as REST service.

Here is my RSS feed generation.

public SyndFeed generate()
{
    SyndFeed feed = new SyndFeedImpl();
    feed.setFeedType( "rss_2.0" );
    feed.setTitle( "My Site" );
    feed.setLink("http://example.com");
    feed.setDescription("Test Site.");

    List<SyndEntry> entries = new ArrayList<SyndEntry>();
    SyndEntry entry = null;
    SyndContent description = null;

    entry = new SyndEntryImpl();
    entry.setTitle( "Entry1" );
    entry.setLink( "http://example.com/entry1" );
    entry.setPublishedDate( new Date() );

    description = new SyndContentImpl();
    description.setType("text/html");
    description.setValue( "This is the content of entry 1." );
    entry.setDescription( description );

    entries.add( entry );
    feed.setEntries(entries);

    return feed;
}

And method of getting the feed

@GET
@Path("/getFeed")
@Produces(MediaType.APPLICATION_XML)
public SyndFeed getFeed()
{
    RSSFeed rssFeed = new RSSFeed ();
    return rssFeed.generate();
}

I'm getting an error for incompatible type for body writer. How could make service to return XML with the feed?

1

There are 1 answers

0
AudioBubble On BEST ANSWER

Jersey does not know how to map an instance of SyndFeed to XML. This works.

@Path("stackoverflow")
public class RomeRessource {

    @GET
    @Path("/feed")
    @Produces("application/rss+xml")
    public Response getFeed() throws IOException, FeedException {
        final SyndFeed feed = generate();

        // Write the SyndFeed to a Writer.
        final SyndFeedOutput output = new SyndFeedOutput();
        final Writer writer = new StringWriter();
        output.output(feed, writer);

        // Return a JAX-RS Response with the Writer as the body.
        return Response.ok(writer.toString()).build();
    }

    private SyndFeed generate() {
        final SyndFeed feed = new SyndFeedImpl();
        feed.setFeedType("rss_2.0");
        feed.setTitle("My Site");
        feed.setLink("http://example.com");
        feed.setDescription("Test Site.");

        final List<SyndEntry> entries = new ArrayList<>();

        final SyndEntry entry = new SyndEntryImpl();
        entry.setTitle("Entry1");
        entry.setLink("http://example.com/entry1");
        entry.setPublishedDate(new Date());

        final SyndContent description = new SyndContentImpl();
        description.setType("text/html");
        description.setValue("This is the content of entry 1.");

        entry.setDescription(description);

        entries.add(entry);

        feed.setEntries(entries);

        return feed;
    }
}

GET the resource:

$ curl -v http://localhost:8080/StackOverflowWeb/webresources/stackoverflow/feed
*   Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /StackOverflowWeb/webresources/stackoverflow/feed HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.42.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: GlassFish Server Open Source Edition  4.1
< X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition  4.1  Java/Oracle Corporation/1.8)
< Content-Type: application/rss+xml
< Date: Sun, 14 Jun 2015 13:15:54 GMT
< Content-Length: 565
<
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>My Site</title>
    <link>http://example.com</link>
    <description>Test Site.</description>
    <item>
      <title>Entry1</title>
      <link>http://example.com/entry1</link>
      <description>This is the content of entry 1.</description>
      <pubDate>Sun, 14 Jun 2015 13:15:54 GMT</pubDate>
      <guid>http://example.com/entry1</guid>
      <dc:date>2015-06-14T13:15:54Z</dc:date>
    </item>
  </channel>
</rss>

* Connection #0 to host localhost left intact