Bael 1273 Spring RSS Feed View (#4707)
* Added example for BAEL-1273 - rss feed with Spring. * Fixed javadoc * Removed useless SpringBootServletInitializer in RSS app's launcher * Explicitely added Spring Boot starting class in pom.xml to prevent errors in package phase.
This commit is contained in:
parent
d1caea7afb
commit
815f655f36
@ -141,6 +141,13 @@
|
|||||||
<groupId>com.google.code.gson</groupId>
|
<groupId>com.google.code.gson</groupId>
|
||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ROME for RSS -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.rometools</groupId>
|
||||||
|
<artifactId>rome</artifactId>
|
||||||
|
<version>${rome.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -283,7 +290,13 @@
|
|||||||
<!-- excel -->
|
<!-- excel -->
|
||||||
<poi.version>3.16-beta1</poi.version>
|
<poi.version>3.16-beta1</poi.version>
|
||||||
|
|
||||||
|
<!-- ROME for RSS -->
|
||||||
|
<rome.version>1.10.0</rome.version>
|
||||||
|
|
||||||
<javax.el.version>2.2.4</javax.el.version>
|
<javax.el.version>2.2.4</javax.el.version>
|
||||||
|
|
||||||
|
<!-- Initial application class for Spring Boot -->
|
||||||
|
<start-class>com.baeldung.app.Application</start-class>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.baeldung.rss;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spring Boot launcher for an application which exposes an RSS Feed.
|
||||||
|
*
|
||||||
|
* @author Donato Rimenti
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
public class RssFeedApplication {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launches a Spring Boot application which exposes an RSS Feed.
|
||||||
|
*
|
||||||
|
* @param args null
|
||||||
|
*/
|
||||||
|
public static void main(final String[] args) {
|
||||||
|
SpringApplication.run(RssFeedApplication.class, args);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.baeldung.rss;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import org.springframework.web.servlet.View;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* REST Controller which returns an RSS Feed created by {@link RssFeedView}.
|
||||||
|
*
|
||||||
|
* @author Donato Rimenti
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
public class RssFeedController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* View used by this controller.
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private RssFeedView view;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an RSS Feed created by {@link #view}.
|
||||||
|
*
|
||||||
|
* @return an RSS Feed
|
||||||
|
*/
|
||||||
|
@GetMapping("/rss")
|
||||||
|
public View getFeed() {
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,98 @@
|
|||||||
|
package com.baeldung.rss;
|
||||||
|
|
||||||
|
import java.sql.Date;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.servlet.view.feed.AbstractRssFeedView;
|
||||||
|
|
||||||
|
import com.rometools.rome.feed.rss.Channel;
|
||||||
|
import com.rometools.rome.feed.rss.Item;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* View for a RSS feed.
|
||||||
|
*
|
||||||
|
* @author Donato Rimenti
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class RssFeedView extends AbstractRssFeedView {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.springframework.web.servlet.view.feed.AbstractFeedView#
|
||||||
|
* buildFeedMetadata(java.util.Map, com.rometools.rome.feed.WireFeed,
|
||||||
|
* javax.servlet.http.HttpServletRequest)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void buildFeedMetadata(Map<String, Object> model, Channel feed, HttpServletRequest request) {
|
||||||
|
feed.setTitle("Baeldung RSS Feed");
|
||||||
|
feed.setDescription("Learn how to program in Java");
|
||||||
|
feed.setLink("http://www.baeldung.com");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.springframework.web.servlet.view.feed.AbstractRssFeedView#
|
||||||
|
* buildFeedItems(java.util.Map, javax.servlet.http.HttpServletRequest,
|
||||||
|
* javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected List<Item> buildFeedItems(Map<String, Object> model, HttpServletRequest request,
|
||||||
|
HttpServletResponse response) {
|
||||||
|
|
||||||
|
// Builds the single entries.
|
||||||
|
Item entryOne = new Item();
|
||||||
|
entryOne.setTitle("JUnit 5 @Test Annotation");
|
||||||
|
entryOne.setAuthor("donatohan.rimenti@gmail.com");
|
||||||
|
entryOne.setLink("http://www.baeldung.com/junit-5-test-annotation");
|
||||||
|
entryOne.setPubDate(Date.from(Instant.parse("2017-12-19T00:00:00Z")));
|
||||||
|
|
||||||
|
Item entryTwo = new Item();
|
||||||
|
entryTwo.setTitle("Creating and Configuring Jetty 9 Server in Java");
|
||||||
|
entryTwo.setAuthor("donatohan.rimenti@gmail.com");
|
||||||
|
entryTwo.setLink("http://www.baeldung.com/jetty-java-programmatic");
|
||||||
|
entryTwo.setPubDate(Date.from(Instant.parse("2018-01-23T00:00:00Z")));
|
||||||
|
|
||||||
|
Item entryThree = new Item();
|
||||||
|
entryThree.setTitle("Flyweight Pattern in Java");
|
||||||
|
entryThree.setAuthor("donatohan.rimenti@gmail.com");
|
||||||
|
entryThree.setLink("http://www.baeldung.com/java-flyweight");
|
||||||
|
entryThree.setPubDate(Date.from(Instant.parse("2018-02-01T00:00:00Z")));
|
||||||
|
|
||||||
|
Item entryFour = new Item();
|
||||||
|
entryFour.setTitle("Multi-Swarm Optimization Algorithm in Java");
|
||||||
|
entryFour.setAuthor("donatohan.rimenti@gmail.com");
|
||||||
|
entryFour.setLink("http://www.baeldung.com/java-multi-swarm-algorithm");
|
||||||
|
entryFour.setPubDate(Date.from(Instant.parse("2018-03-09T00:00:00Z")));
|
||||||
|
|
||||||
|
Item entryFive = new Item();
|
||||||
|
entryFive.setTitle("A Simple Tagging Implementation with MongoDB");
|
||||||
|
entryFive.setAuthor("donatohan.rimenti@gmail.com");
|
||||||
|
entryFive.setLink("http://www.baeldung.com/mongodb-tagging");
|
||||||
|
entryFive.setPubDate(Date.from(Instant.parse("2018-03-27T00:00:00Z")));
|
||||||
|
|
||||||
|
Item entrySix = new Item();
|
||||||
|
entrySix.setTitle("Double-Checked Locking with Singleton");
|
||||||
|
entrySix.setAuthor("donatohan.rimenti@gmail.com");
|
||||||
|
entrySix.setLink("http://www.baeldung.com/java-singleton-double-checked-locking");
|
||||||
|
entrySix.setPubDate(Date.from(Instant.parse("2018-04-23T00:00:00Z")));
|
||||||
|
|
||||||
|
Item entrySeven = new Item();
|
||||||
|
entrySeven.setTitle("Introduction to Dagger 2");
|
||||||
|
entrySeven.setAuthor("donatohan.rimenti@gmail.com");
|
||||||
|
entrySeven.setLink("http://www.baeldung.com/dagger-2");
|
||||||
|
entrySeven.setPubDate(Date.from(Instant.parse("2018-06-30T00:00:00Z")));
|
||||||
|
|
||||||
|
// Creates the feed.
|
||||||
|
return Arrays.asList(entryOne, entryTwo, entryThree, entryFour, entryFive, entrySix, entrySeven);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package com.baeldung.rss;
|
||||||
|
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||||
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||||
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for {@link RssFeedApplication}.
|
||||||
|
*
|
||||||
|
* @author Donato Rimenti
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@SpringBootTest(classes = RssFeedApplication.class)
|
||||||
|
public class RssFeedUnitTest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application context.
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private WebApplicationContext context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mock to perform tests on Spring Web Controller.
|
||||||
|
*/
|
||||||
|
private MockMvc mvc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the test up.
|
||||||
|
*/
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
mvc = MockMvcBuilders.webAppContextSetup(context).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the RSS feed endpoint and checks that the result matches an
|
||||||
|
* expected one.
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void givenRssFeed_whenComparedWithExisting_thenEquals() throws Exception {
|
||||||
|
// The expected response.
|
||||||
|
String expectedResult = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><rss version=\"2.0\"> <channel> <title>Baeldung RSS Feed</title> <link>http://www.baeldung.com</link> <description>Learn how to program in Java</description> <item> <title>JUnit 5 @Test Annotation</title> <link>http://www.baeldung.com/junit-5-test-annotation</link> <pubDate>Tue, 19 Dec 2017 00:00:00 GMT</pubDate> <author>donatohan.rimenti@gmail.com</author> </item> <item> <title>Creating and Configuring Jetty 9 Server in Java</title> <link>http://www.baeldung.com/jetty-java-programmatic</link> <pubDate>Tue, 23 Jan 2018 00:00:00 GMT</pubDate> <author>donatohan.rimenti@gmail.com</author> </item> <item> <title>Flyweight Pattern in Java</title> <link>http://www.baeldung.com/java-flyweight</link> <pubDate>Thu, 01 Feb 2018 00:00:00 GMT</pubDate> <author>donatohan.rimenti@gmail.com</author> </item> <item> <title>Multi-Swarm Optimization Algorithm in Java</title> <link>http://www.baeldung.com/java-multi-swarm-algorithm</link> <pubDate>Fri, 09 Mar 2018 00:00:00 GMT</pubDate> <author>donatohan.rimenti@gmail.com</author> </item> <item> <title>A Simple Tagging Implementation with MongoDB</title> <link>http://www.baeldung.com/mongodb-tagging</link> <pubDate>Tue, 27 Mar 2018 00:00:00 GMT</pubDate> <author>donatohan.rimenti@gmail.com</author> </item> <item> <title>Double-Checked Locking with Singleton</title> <link>http://www.baeldung.com/java-singleton-double-checked-locking</link> <pubDate>Mon, 23 Apr 2018 00:00:00 GMT</pubDate> <author>donatohan.rimenti@gmail.com</author> </item> <item> <title>Introduction to Dagger 2</title> <link>http://www.baeldung.com/dagger-2</link> <pubDate>Sat, 30 Jun 2018 00:00:00 GMT</pubDate> <author>donatohan.rimenti@gmail.com</author> </item> </channel></rss>";
|
||||||
|
|
||||||
|
// Performs a post against the RSS feed endpoint and checks that the
|
||||||
|
// result is equals to the expected one.
|
||||||
|
mvc.perform(MockMvcRequestBuilders.get("/rss")).andExpect(status().isOk())
|
||||||
|
.andExpect(content().xml(expectedResult));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user