> errors) {
+ this.errors = errors;
+ }
+}
diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/error/ValidationError.java b/src/main/java/io/zipcoder/tc_spring_poll_application/error/ValidationError.java
new file mode 100644
index 0000000..59fd6af
--- /dev/null
+++ b/src/main/java/io/zipcoder/tc_spring_poll_application/error/ValidationError.java
@@ -0,0 +1,24 @@
+package io.zipcoder.tc_spring_poll_application.error;
+
+public class ValidationError {
+
+ private String code;
+ private String message;
+
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/exception/ResourceNotFoundException.java b/src/main/java/io/zipcoder/tc_spring_poll_application/exception/ResourceNotFoundException.java
new file mode 100644
index 0000000..543b080
--- /dev/null
+++ b/src/main/java/io/zipcoder/tc_spring_poll_application/exception/ResourceNotFoundException.java
@@ -0,0 +1,47 @@
+package io.zipcoder.tc_spring_poll_application.exception;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.http.HttpStatus;
+
+
+@ResponseStatus(HttpStatus.NOT_FOUND)
+public class ResourceNotFoundException extends RuntimeException {
+ /**
+ * Constructs a new runtime exception with {@code null} as its
+ * detail message. The cause is not initialized, and may subsequently be
+ * initialized by a call to {@link #initCause}.
+ */
+ public ResourceNotFoundException() {
+ }
+
+ /**
+ * Constructs a new runtime exception with the specified detail message and
+ * cause. Note that the detail message associated with
+ * {@code cause} is not automatically incorporated in
+ * this runtime exception's detail message.
+ *
+ * @param message the detail message (which is saved for later retrieval
+ * by the {@link #getMessage()} method).
+ * @param cause the cause (which is saved for later retrieval by the
+ * {@link #getCause()} method). (A null value is
+ * permitted, and indicates that the cause is nonexistent or
+ * unknown.)
+ * @since 1.4
+ */
+ public ResourceNotFoundException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * Constructs a new runtime exception with the specified detail message.
+ * The cause is not initialized, and may subsequently be initialized by a
+ * call to {@link #initCause}.
+ *
+ * @param message the detail message. The detail message is saved for
+ * later retrieval by the {@link #getMessage()} method.
+ */
+ public ResourceNotFoundException(String message) {
+ super(message);
+ }
+
+
+}
diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/exception/RestExceptionHandler.java b/src/main/java/io/zipcoder/tc_spring_poll_application/exception/RestExceptionHandler.java
new file mode 100644
index 0000000..10a7b4b
--- /dev/null
+++ b/src/main/java/io/zipcoder/tc_spring_poll_application/exception/RestExceptionHandler.java
@@ -0,0 +1,63 @@
+package io.zipcoder.tc_spring_poll_application.exception;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.http.*;
+import io.zipcoder.tc_spring_poll_application.error.*;
+import java.util.*;
+import java.io.*;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.context.MessageSource;
+import org.springframework.validation.*;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@ControllerAdvice
+public class RestExceptionHandler {
+ @Autowired
+ private MessageSource messageSource;
+
+ @ExceptionHandler(ResourceNotFoundException.class)
+ public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException rnfe, HttpServletRequest request) {
+ ErrorDetail detail = new ErrorDetail();
+ detail.setTimeStamp(new Date().getTime());
+ detail.setDetail(rnfe.getMessage());
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ rnfe.printStackTrace(pw);
+ detail.setDeveloperMessage(sw.toString());
+
+ detail.setTitle("Resource Not Found Exception");
+ detail.setStatus(HttpStatus.NOT_FOUND.value());
+ return new ResponseEntity(detail, HttpStatus.NOT_FOUND);}
+
+
+ @ExceptionHandler(MethodArgumentNotValidException.class)
+ public ResponseEntity>
+ handleValidationError(MethodArgumentNotValidException manve, HttpServletRequest request){
+ ErrorDetail errorDetail = new ErrorDetail();
+ errorDetail.setTimeStamp(new Date().getTime());
+ errorDetail.setTitle("Resource Validation Failed");
+ errorDetail.setStatus(HttpStatus.BAD_REQUEST.value());
+ errorDetail.setDetail(manve.getMessage());
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ manve.printStackTrace(pw);
+ errorDetail.setDeveloperMessage(sw.toString());
+
+ List fieldErrors = manve.getBindingResult().getFieldErrors();
+ for(FieldError fe : fieldErrors) {
+
+ List validationErrorList = errorDetail.getErrors().get(fe.getField());
+ if(validationErrorList == null) {
+ validationErrorList = new ArrayList<>();
+ errorDetail.getErrors().put(fe.getField(), validationErrorList);
+ }
+ ValidationError validationError = new ValidationError();
+ validationError.setCode(fe.getCode());
+ validationError.setMessage(messageSource.getMessage(fe, null));
+ validationErrorList.add(validationError);
+ }
+ return new ResponseEntity(errorDetail, HttpStatus.BAD_REQUEST);
+ }
+
+}
diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/repositories/OptionRepository.java b/src/main/java/io/zipcoder/tc_spring_poll_application/repositories/OptionRepository.java
new file mode 100644
index 0000000..5a5e31c
--- /dev/null
+++ b/src/main/java/io/zipcoder/tc_spring_poll_application/repositories/OptionRepository.java
@@ -0,0 +1,8 @@
+package io.zipcoder.tc_spring_poll_application.repositories;
+import org.springframework.data.repository.CrudRepository;
+import io.zipcoder.tc_spring_poll_application.domain.Option;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface OptionRepository extends CrudRepository