diff --git a/spring-boot-bootstrap/.gitignore b/spring-boot-bootstrap/.gitignore
new file mode 100644
index 0000000000..2af7cefb0a
--- /dev/null
+++ b/spring-boot-bootstrap/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml
new file mode 100644
index 0000000000..697a139eb5
--- /dev/null
+++ b/spring-boot-bootstrap/pom.xml
@@ -0,0 +1,75 @@
+
+
+ 4.0.0
+
+ org.baeldung
+ spring-boot-bootstrap
+ 0.0.1-SNAPSHOT
+ jar
+
+ spring-boot-bootstrap
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.3.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ io.rest-assured
+ rest-assured
+ 3.0.3
+ test
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/Application.java b/spring-boot-bootstrap/src/main/java/org/baeldung/Application.java
new file mode 100644
index 0000000000..f7e7bb0347
--- /dev/null
+++ b/spring-boot-bootstrap/src/main/java/org/baeldung/Application.java
@@ -0,0 +1,19 @@
+package org.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@SpringBootApplication
+@ComponentScan("org.baeldung")
+@EnableJpaRepositories("org.baeldung.persistence.repo")
+@EntityScan("org.baeldung.persistence.model")
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/model/Book.java b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/model/Book.java
new file mode 100644
index 0000000000..02060e17c9
--- /dev/null
+++ b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/model/Book.java
@@ -0,0 +1,96 @@
+package org.baeldung.persistence.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Book {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ @Column(nullable = false, unique = true)
+ private String title;
+
+ @Column(nullable = false)
+ private String author;
+
+ //
+
+ public Book() {
+ super();
+ }
+
+ public Book(String title, String author) {
+ super();
+ this.title = title;
+ this.author = author;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((author == null) ? 0 : author.hashCode());
+ result = prime * result + (int) (id ^ (id >>> 32));
+ result = prime * result + ((title == null) ? 0 : title.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Book other = (Book) obj;
+ if (author == null) {
+ if (other.author != null)
+ return false;
+ } else if (!author.equals(other.author))
+ return false;
+ if (id != other.id)
+ return false;
+ if (title == null) {
+ if (other.title != null)
+ return false;
+ } else if (!title.equals(other.title))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "Book [id=" + id + ", title=" + title + ", author=" + author + "]";
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/repo/BookRepository.java b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/repo/BookRepository.java
new file mode 100644
index 0000000000..ec3a3e25bc
--- /dev/null
+++ b/spring-boot-bootstrap/src/main/java/org/baeldung/persistence/repo/BookRepository.java
@@ -0,0 +1,10 @@
+package org.baeldung.persistence.repo;
+
+import java.util.List;
+
+import org.baeldung.persistence.model.Book;
+import org.springframework.data.repository.CrudRepository;
+
+public interface BookRepository extends CrudRepository {
+ List findByTitle(String title);
+}
diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/web/BookController.java b/spring-boot-bootstrap/src/main/java/org/baeldung/web/BookController.java
new file mode 100644
index 0000000000..544ac80217
--- /dev/null
+++ b/spring-boot-bootstrap/src/main/java/org/baeldung/web/BookController.java
@@ -0,0 +1,74 @@
+package org.baeldung.web;
+
+import java.util.List;
+
+import org.baeldung.persistence.model.Book;
+import org.baeldung.persistence.repo.BookRepository;
+import org.baeldung.web.exception.BookIdMismatchException;
+import org.baeldung.web.exception.BookNotFoundException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/books")
+public class BookController {
+
+ @Autowired
+ private BookRepository bookRepository;
+
+ @GetMapping
+ public Iterable findAll() {
+ return bookRepository.findAll();
+ }
+
+ @GetMapping("/title/{bookTitle}")
+ public List findByTitle(@PathVariable String bookTitle) {
+ return bookRepository.findByTitle(bookTitle);
+ }
+
+ @GetMapping("/{id}")
+ public Book findOne(@PathVariable Long id) {
+ final Book book = bookRepository.findOne(id);
+ if (book == null) {
+ throw new BookNotFoundException();
+ }
+ return book;
+ }
+
+ @PostMapping
+ @ResponseStatus(HttpStatus.CREATED)
+ public Book create(@RequestBody Book book) {
+ return bookRepository.save(book);
+ }
+
+ @DeleteMapping("/{id}")
+ public void delete(@PathVariable Long id) {
+ final Book book = bookRepository.findOne(id);
+ if (book == null) {
+ throw new BookNotFoundException();
+ }
+ bookRepository.delete(id);
+ }
+
+ @PutMapping("/{id}")
+ public Book updateBook(@RequestBody Book book, @PathVariable Long id) {
+ if (book.getId() != id) {
+ throw new BookIdMismatchException();
+ }
+ final Book old = bookRepository.findOne(id);
+ if (old == null) {
+ throw new BookNotFoundException();
+ }
+ return bookRepository.save(book);
+ }
+
+}
diff --git a/spring-boot-bootstrap/src/main/java/org/baeldung/web/RestExceptionHandler.java b/spring-boot-bootstrap/src/main/java/org/baeldung/web/RestExceptionHandler.java
new file mode 100644
index 0000000000..60153fc92f
--- /dev/null
+++ b/spring-boot-bootstrap/src/main/java/org/baeldung/web/RestExceptionHandler.java
@@ -0,0 +1,32 @@
+package org.baeldung.web;
+
+import org.baeldung.web.exception.BookIdMismatchException;
+import org.baeldung.web.exception.BookNotFoundException;
+import org.hibernate.exception.ConstraintViolationException;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+
+@ControllerAdvice
+public class RestExceptionHandler extends ResponseEntityExceptionHandler {
+
+ public RestExceptionHandler() {
+ super();
+ }
+
+ @ExceptionHandler({ BookNotFoundException.class })
+ protected ResponseEntity