diff --git a/.gitignore b/.gitignore
index 2af7cef..ff29930 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,4 +21,5 @@ build/
nbbuild/
dist/
nbdist/
-.nb-gradle/
\ No newline at end of file
+.nb-gradle/
+.elasticbeanstalk
diff --git a/Readme.md b/Readme.md
index ecdc1c8..dd07c08 100644
--- a/Readme.md
+++ b/Readme.md
@@ -15,7 +15,7 @@ Build Restful CRUD API for a simple Note-Taking application using Spring Boot, M
**1. Clone the application**
```bash
-git@github.com:callicoder/spring-boot-mysql-rest-api-tutorial.git
+git clone https://github.com/callicoder/spring-boot-mysql-rest-api-tutorial.git
```
**2. Create Mysql database**
@@ -29,7 +29,7 @@ create database notes_app
+ change `spring.datasource.username` and `spring.datasource.password` as per your mysql installation
-**2. Build and run the app using maven**
+**4. Build and run the app using maven**
```bash
mvn package
diff --git a/pom.xml b/pom.xml
index 19f9a8a..baec0d9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,14 +14,14 @@
org.springframework.boot
spring-boot-starter-parent
- 1.5.4.RELEASE
+ 2.5.5
UTF-8
UTF-8
- 1.8
+ 11
@@ -33,7 +33,10 @@
org.springframework.boot
spring-boot-starter-web
-
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
org.springframework.boot
spring-boot-devtools
diff --git a/src/main/java/com/example/easynotes/controller/IndexController.java b/src/main/java/com/example/easynotes/controller/IndexController.java
new file mode 100644
index 0000000..f9c5ea4
--- /dev/null
+++ b/src/main/java/com/example/easynotes/controller/IndexController.java
@@ -0,0 +1,16 @@
+package com.example.easynotes.controller;
+
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/")
+public class IndexController {
+
+ @GetMapping
+ public String sayHello() {
+ return "Hello and Welcome to the EasyNotes application. You can create a new Note by making a POST request to /api/notes endpoint.";
+ }
+}
diff --git a/src/main/java/com/example/easynotes/controller/NoteController.java b/src/main/java/com/example/easynotes/controller/NoteController.java
index c3663d8..52f2ef0 100644
--- a/src/main/java/com/example/easynotes/controller/NoteController.java
+++ b/src/main/java/com/example/easynotes/controller/NoteController.java
@@ -1,5 +1,6 @@
package com.example.easynotes.controller;
+import com.example.easynotes.exception.ResourceNotFoundException;
import com.example.easynotes.model.Note;
import com.example.easynotes.repository.NoteRepository;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,42 +25,38 @@ public List getAllNotes() {
return noteRepository.findAll();
}
- @GetMapping("/notes/{id}")
- public ResponseEntity getNoteById(@PathVariable(value = "id") Long noteId) {
- Note note = noteRepository.findOne(noteId);
- if(note == null) {
- return ResponseEntity.notFound().build();
- }
- return ResponseEntity.ok().body(note);
- }
-
@PostMapping("/notes")
public Note createNote(@Valid @RequestBody Note note) {
return noteRepository.save(note);
}
+ @GetMapping("/notes/{id}")
+ public Note getNoteById(@PathVariable(value = "id") Long noteId) {
+ return noteRepository.findById(noteId)
+ .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId));
+ }
+
@PutMapping("/notes/{id}")
- public ResponseEntity updateNote(@PathVariable(value = "id") Long noteId,
+ public Note updateNote(@PathVariable(value = "id") Long noteId,
@Valid @RequestBody Note noteDetails) {
- Note note = noteRepository.findOne(noteId);
- if(note == null) {
- return ResponseEntity.notFound().build();
- }
+
+ Note note = noteRepository.findById(noteId)
+ .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId));
+
note.setTitle(noteDetails.getTitle());
note.setContent(noteDetails.getContent());
Note updatedNote = noteRepository.save(note);
- return ResponseEntity.ok(updatedNote);
+ return updatedNote;
}
@DeleteMapping("/notes/{id}")
- public ResponseEntity deleteNote(@PathVariable(value = "id") Long noteId) {
- Note note = noteRepository.findOne(noteId);
- if(note == null) {
- return ResponseEntity.notFound().build();
- }
+ public ResponseEntity> deleteNote(@PathVariable(value = "id") Long noteId) {
+ Note note = noteRepository.findById(noteId)
+ .orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId));
noteRepository.delete(note);
+
return ResponseEntity.ok().build();
}
}
diff --git a/src/main/java/com/example/easynotes/exception/ResourceNotFoundException.java b/src/main/java/com/example/easynotes/exception/ResourceNotFoundException.java
new file mode 100644
index 0000000..4e4c4f2
--- /dev/null
+++ b/src/main/java/com/example/easynotes/exception/ResourceNotFoundException.java
@@ -0,0 +1,30 @@
+package com.example.easynotes.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.NOT_FOUND)
+public class ResourceNotFoundException extends RuntimeException {
+ private String resourceName;
+ private String fieldName;
+ private Object fieldValue;
+
+ public ResourceNotFoundException( String resourceName, String fieldName, Object fieldValue) {
+ super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue));
+ this.resourceName = resourceName;
+ this.fieldName = fieldName;
+ this.fieldValue = fieldValue;
+ }
+
+ public String getResourceName() {
+ return resourceName;
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public Object getFieldValue() {
+ return fieldValue;
+ }
+}
diff --git a/src/main/java/com/example/easynotes/model/Note.java b/src/main/java/com/example/easynotes/model/Note.java
index 093a6b9..4f8b6b1 100644
--- a/src/main/java/com/example/easynotes/model/Note.java
+++ b/src/main/java/com/example/easynotes/model/Note.java
@@ -1,12 +1,12 @@
package com.example.easynotes.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import org.hibernate.validator.constraints.NotBlank;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
@@ -19,7 +19,7 @@
allowGetters = true)
public class Note {
@Id
- @GeneratedValue(strategy = GenerationType.AUTO)
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
diff --git a/src/main/java/com/example/easynotes/repository/NoteRepository.java b/src/main/java/com/example/easynotes/repository/NoteRepository.java
index 1204886..4b7b8b3 100644
--- a/src/main/java/com/example/easynotes/repository/NoteRepository.java
+++ b/src/main/java/com/example/easynotes/repository/NoteRepository.java
@@ -2,10 +2,13 @@
import com.example.easynotes.model.Note;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
/**
* Created by rajeevkumarsingh on 27/06/17.
*/
+
+@Repository
public interface NoteRepository extends JpaRepository {
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 41354eb..d357d46 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,13 +1,13 @@
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
-spring.datasource.url = jdbc:mysql://localhost:3306/notes_app?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
+spring.datasource.url = jdbc:mysql://localhost:3306/notes_app?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
spring.datasource.username = root
-spring.datasource.password = root
+spring.datasource.password = callicoder
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
-spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
+spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
\ No newline at end of file
diff --git a/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java b/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java
index 4bf539c..298ed22 100644
--- a/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java
+++ b/src/test/java/com/example/easynotes/EasyNotesApplicationTests.java
@@ -1,11 +1,8 @@
package com.example.easynotes;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-@RunWith(SpringRunner.class)
@SpringBootTest
public class EasyNotesApplicationTests {