Provides a REST API for a mock (book) library
This project was an excuse to build a Java REST based application using Spring. The application provides an API around the mechanics of a library, but currently only contains the Book resource. More to be added...
This uses Spring's
AbstractAnnotationConfigDispatcherServletInitializer to allow for a web.xml-less web
application project. All configuration that would be stored within the web.xml is instead stored within the
org.library.WebApplicationInitializer. Spring Beans are provided within
classes instead of xml files. The project uses Spring Profiles to dynamically load the configuration based on the
environment. For example, in the
development environment the
org.library.config.data.DevelopmentDataConfig is loaded which uses an embedded
and populates the database with a preconfigured set of books found in the
data.json file. However
production environment the
org.library.config.data.ProductionDataConfig is loaded
which uses JNDI to retrieve the
DataSource and does not pre-populate the database.
Spring Data is used to configure and load the database, as well as the entities and repositories. For example,
org.library.repository.BookRepository references the
The entities extend from an internal
org.library.domain.AbstractPersistable which provides its own
org.library.persistence.UseExistingOrGenerateIdGenerator. This was necessary to use IDs
specified in the
data.json data file used to pre-populate the database, but also generate unique IDs
when the ID is not specified. The repository interfaces extend from Spring Data to automatically provide default
CRUD operations, as well as paging and sorting functions.
Validation is done at the API layer to enforce correct data on POST or PUT operations. This uses a combination of
JSR-303 and Hibernate to provide validation. Annotations are added to the entity class to declare the requirements
@Valid annotation is added to the bean itself in the controllers. A
is defined with error messages stored in
messages/errors.properties. Because the messages were not
supplied by default, an exception resolver was added to use the message in the response error message if available
Both unit and integration tests were provided. For integration tests, Spring Test was used to load up the configuration
prior to running the tests.
org.springframework.test.web.servlet.MockMvc was used to send mock
requests to test the REST APIs. Travis-CI integration is also implemented, with tests running against Oracle JDK 7
and Open JDK 7.
Clone the project, run
mvn compile test-compile to download dependencies and compile the project.
Java 7 is required. To run the tests, execute
An Ant build file was created to simplify starting the server to run the application. Run
to start the application using an embedded Tomcat 7 server (and embedded HSQL database).