From 5b78e862e2244f20b42bfedd50339cbd4a352d9d Mon Sep 17 00:00:00 2001 From: cladams0203 Date: Mon, 7 Sep 2020 22:10:03 -0400 Subject: [PATCH] finished guided project --- usermodel-exceptions-initial/pom.xml | 4 +- .../usermodel/config/SwaggerWebMVC.java | 18 ++++++ .../exceptions/CustomErrorDetails.java | 35 ++++++++++ .../exceptions/ResourceNotFoundException.java | 10 +++ .../handlers/RestExceptionHandler.java | 57 +++++++++++++++++ .../usermodel/models/ErrorDetail.java | 64 +++++++++++++++++++ .../lambdaschool/usermodel/models/User.java | 2 + .../usermodel/models/ValidationError.java | 23 +++++++ .../usermodel/services/HelperFunctions.java | 10 +++ .../services/HelperFunctionsImpl.java | 36 +++++++++++ .../usermodel/services/RoleServiceImpl.java | 9 +-- .../usermodel/services/UserServiceImpl.java | 13 ++-- .../services/UseremailServiceImpl.java | 9 +-- .../src/main/resources/application.properties | 9 +++ 14 files changed, 283 insertions(+), 16 deletions(-) create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/config/SwaggerWebMVC.java create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/CustomErrorDetails.java create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/ResourceNotFoundException.java create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/handlers/RestExceptionHandler.java create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ErrorDetail.java create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ValidationError.java create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctions.java create mode 100644 usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctionsImpl.java diff --git a/usermodel-exceptions-initial/pom.xml b/usermodel-exceptions-initial/pom.xml index eedeb7e..0bd6bcc 100644 --- a/usermodel-exceptions-initial/pom.xml +++ b/usermodel-exceptions-initial/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.2.8.RELEASE + 2.2.9.RELEASE com.lambdaschool @@ -15,7 +15,7 @@ Demo project for Spring Boot - 14 + 11 diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/config/SwaggerWebMVC.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/config/SwaggerWebMVC.java new file mode 100644 index 0000000..6101a78 --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/config/SwaggerWebMVC.java @@ -0,0 +1,18 @@ +package com.lambdaschool.usermodel.config; + + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SwaggerWebMVC implements WebMvcConfigurer { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("swagger-ui.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars"); + } +} diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/CustomErrorDetails.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/CustomErrorDetails.java new file mode 100644 index 0000000..9570c61 --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/CustomErrorDetails.java @@ -0,0 +1,35 @@ +package com.lambdaschool.usermodel.exceptions; + +import com.lambdaschool.usermodel.services.HelperFunctions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.WebRequest; + +import java.util.LinkedHashMap; +import java.util.Map; + + +@Component +public class CustomErrorDetails extends DefaultErrorAttributes { + + @Autowired + HelperFunctions helperFunctions; + + @Override + public Map getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { + + Map errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace); + + Map errorDetails = new LinkedHashMap<>(); + errorDetails.put("title", errorAttributes.get("error")); + errorDetails.put("status", errorAttributes.get("status")); + errorDetails.put("detail", errorAttributes.get("message")); + errorDetails.put("timestamp", errorAttributes.get("timestamp")); + errorDetails.put("developerMessage", "path " + errorAttributes.get("path")); + + errorDetails.put("errors", helperFunctions.getConstraintViolations(this.getError(webRequest))); + + return errorDetails; + } +} diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/ResourceNotFoundException.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/ResourceNotFoundException.java new file mode 100644 index 0000000..9551d7b --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/exceptions/ResourceNotFoundException.java @@ -0,0 +1,10 @@ +package com.lambdaschool.usermodel.exceptions; + + + +public class ResourceNotFoundException extends RuntimeException { + + public ResourceNotFoundException(String message) { + super("Error from application " + message); + } +} diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/handlers/RestExceptionHandler.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/handlers/RestExceptionHandler.java new file mode 100644 index 0000000..cb78bb0 --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/handlers/RestExceptionHandler.java @@ -0,0 +1,57 @@ +package com.lambdaschool.usermodel.handlers; + +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; +import com.lambdaschool.usermodel.models.ErrorDetail; +import com.lambdaschool.usermodel.services.HelperFunctions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +import java.util.Date; + + +@Order(Ordered.HIGHEST_PRECEDENCE) +@RestControllerAdvice +public class RestExceptionHandler extends ResponseEntityExceptionHandler { + + @Autowired + HelperFunctions helperFunctions; + + public RestExceptionHandler() { + super(); + } + + @ExceptionHandler(ResourceNotFoundException.class) + public ResponseEntity handleResourceNotFoundException(ResourceNotFoundException rnfe){ + ErrorDetail errorDetail = new ErrorDetail(); + errorDetail.setTimestamp(new Date()); + errorDetail.setStatus(HttpStatus.NOT_FOUND.value()); + errorDetail.setTitle("Resource not Found"); + errorDetail.setDetail(rnfe.getMessage()); + errorDetail.setDeveloperMessage(rnfe.getClass().getName()); + + errorDetail.setErrors(helperFunctions.getConstraintViolations(rnfe)); + + return new ResponseEntity<>(errorDetail, null, HttpStatus.NOT_FOUND); + } + @Override + protected ResponseEntity handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) { + + ErrorDetail errDetail = new ErrorDetail(); + errDetail.setTimestamp(new Date()); + errDetail.setStatus(status.value()); + errDetail.setTitle("Rest Internal Exception"); + errDetail.setDetail(ex.getMessage()); + errDetail.setDeveloperMessage(ex.getClass().getName()); + + errDetail.setErrors(helperFunctions.getConstraintViolations(ex)); + return new ResponseEntity<>(errDetail, null, status); + } +} diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ErrorDetail.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ErrorDetail.java new file mode 100644 index 0000000..877a434 --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ErrorDetail.java @@ -0,0 +1,64 @@ +package com.lambdaschool.usermodel.models; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ErrorDetail { + + private String title; + private int status; + private String detail; + private Date timestamp; + private String developerMessage; + + private List errors = new ArrayList<>(); + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public Date getTimestamp() { + return timestamp; + } + + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + + public String getDeveloperMessage() { + return developerMessage; + } + + public void setDeveloperMessage(String developerMessage) { + this.developerMessage = developerMessage; + } + + public List getErrors() { + return errors; + } + + public void setErrors(List errors) { + this.errors = errors; + } +} diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/User.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/User.java index 658c4c3..b2e8db7 100644 --- a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/User.java +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/User.java @@ -12,6 +12,7 @@ import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Email; +import javax.validation.constraints.Size; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -44,6 +45,7 @@ public class User */ @Column(nullable = false) @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Size(min = 4, max = 30) private String password; /** diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ValidationError.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ValidationError.java new file mode 100644 index 0000000..3dd6184 --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/models/ValidationError.java @@ -0,0 +1,23 @@ +package com.lambdaschool.usermodel.models; + +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/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctions.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctions.java new file mode 100644 index 0000000..65f2d5c --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctions.java @@ -0,0 +1,10 @@ +package com.lambdaschool.usermodel.services; + +import com.lambdaschool.usermodel.models.ValidationError; + +import java.util.List; + +public interface HelperFunctions { + + List getConstraintViolations(Throwable cause); +} diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctionsImpl.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctionsImpl.java new file mode 100644 index 0000000..56b93ec --- /dev/null +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/HelperFunctionsImpl.java @@ -0,0 +1,36 @@ +package com.lambdaschool.usermodel.services; + +import com.lambdaschool.usermodel.models.ValidationError; +import org.springframework.stereotype.Service; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.ArrayList; +import java.util.List; + +@Service(value = "helperFunctions") +public class HelperFunctionsImpl implements HelperFunctions { + + @Override + public List getConstraintViolations(Throwable cause) { + + while ((cause) != null && !(cause instanceof ConstraintViolationException)){ + + cause = cause.getCause(); + } + List listVE = new ArrayList<>(); + + if (cause != null){ + ConstraintViolationException ex= (ConstraintViolationException) cause; + for(ConstraintViolation cv : ex.getConstraintViolations()){ + ValidationError newVe = new ValidationError(); + + newVe.setCode(cv.getInvalidValue().toString()); + newVe.setMessage(cv.getMessage()); + listVE.add(newVe); + } + } + + return listVE; + } +} diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/RoleServiceImpl.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/RoleServiceImpl.java index ea20136..79d466a 100644 --- a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/RoleServiceImpl.java +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/RoleServiceImpl.java @@ -1,5 +1,6 @@ package com.lambdaschool.usermodel.services; +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; import com.lambdaschool.usermodel.models.Role; import com.lambdaschool.usermodel.repository.RoleRepository; import com.lambdaschool.usermodel.repository.UserRepository; @@ -8,7 +9,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityExistsException; -import javax.persistence.EntityNotFoundException; + import java.util.ArrayList; import java.util.List; @@ -57,7 +58,7 @@ public List findAll() public Role findRoleById(long id) { return rolerepos.findById(id) - .orElseThrow(() -> new EntityNotFoundException("Role id " + id + " not found!")); + .orElseThrow(() -> new ResourceNotFoundException("Role id " + id + " not found!")); } @Override @@ -70,7 +71,7 @@ public Role findByName(String name) return rr; } else { - throw new EntityNotFoundException(name); + throw new ResourceNotFoundException(name); } } @@ -101,7 +102,7 @@ public Role update(long id, { if (role.getName() == null) { - throw new EntityNotFoundException("No role name found to update!"); + throw new ResourceNotFoundException("No role name found to update!"); } if (role.getUsers() diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java index b140881..3d86042 100755 --- a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UserServiceImpl.java @@ -1,5 +1,6 @@ package com.lambdaschool.usermodel.services; +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; import com.lambdaschool.usermodel.models.Role; import com.lambdaschool.usermodel.models.User; import com.lambdaschool.usermodel.models.UserRoles; @@ -9,7 +10,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityNotFoundException; + import java.util.ArrayList; import java.util.List; @@ -34,10 +35,10 @@ public class UserServiceImpl private RoleService roleService; public User findUserById(long id) throws - EntityNotFoundException + ResourceNotFoundException { return userrepos.findById(id) - .orElseThrow(() -> new EntityNotFoundException("User id " + id + " not found!")); + .orElseThrow(() -> new ResourceNotFoundException("User id " + id + " not found!")); } @Override @@ -65,7 +66,7 @@ public List findAll() public void delete(long id) { userrepos.findById(id) - .orElseThrow(() -> new EntityNotFoundException("User id " + id + " not found!")); + .orElseThrow(() -> new ResourceNotFoundException("User id " + id + " not found!")); userrepos.deleteById(id); } @@ -75,7 +76,7 @@ public User findByName(String name) User uu = userrepos.findByUsername(name.toLowerCase()); if (uu == null) { - throw new EntityNotFoundException("User name " + name + " not found!"); + throw new ResourceNotFoundException("User name " + name + " not found!"); } return uu; } @@ -89,7 +90,7 @@ public User save(User user) if (user.getUserid() != 0) { userrepos.findById(user.getUserid()) - .orElseThrow(() -> new EntityNotFoundException("User id " + user.getUserid() + " not found!")); + .orElseThrow(() -> new ResourceNotFoundException("User id " + user.getUserid() + " not found!")); newUser.setUserid(user.getUserid()); } diff --git a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UseremailServiceImpl.java b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UseremailServiceImpl.java index f2f1aaa..75cd272 100644 --- a/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UseremailServiceImpl.java +++ b/usermodel-exceptions-initial/src/main/java/com/lambdaschool/usermodel/services/UseremailServiceImpl.java @@ -1,5 +1,6 @@ package com.lambdaschool.usermodel.services; +import com.lambdaschool.usermodel.exceptions.ResourceNotFoundException; import com.lambdaschool.usermodel.models.User; import com.lambdaschool.usermodel.models.Useremail; import com.lambdaschool.usermodel.repository.UseremailRepository; @@ -7,7 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.persistence.EntityNotFoundException; + import java.util.ArrayList; import java.util.List; @@ -49,7 +50,7 @@ public List findAll() public Useremail findUseremailById(long id) { return useremailrepos.findById(id) - .orElseThrow(() -> new EntityNotFoundException("Useremail with id " + id + " Not Found!")); + .orElseThrow(() -> new ResourceNotFoundException("Useremail with id " + id + " Not Found!")); } @Transactional @@ -62,7 +63,7 @@ public void delete(long id) useremailrepos.deleteById(id); } else { - throw new EntityNotFoundException("Useremail with id " + id + " Not Found!"); + throw new ResourceNotFoundException("Useremail with id " + id + " Not Found!"); } } @@ -80,7 +81,7 @@ public Useremail update( return useremailrepos.save(useremail); } else { - throw new EntityNotFoundException("Useremail with id " + useremailid + " Not Found!"); + throw new ResourceNotFoundException("Useremail with id " + useremailid + " Not Found!"); } } diff --git a/usermodel-exceptions-initial/src/main/resources/application.properties b/usermodel-exceptions-initial/src/main/resources/application.properties index 9758fe0..356e954 100644 --- a/usermodel-exceptions-initial/src/main/resources/application.properties +++ b/usermodel-exceptions-initial/src/main/resources/application.properties @@ -23,3 +23,12 @@ spring.datasource.initialization-mode=always # spring.jpa.hibernate.ddl-auto=update # since we have our data in SeedData, do not also load it from data.sql # spring.datasource.initialization-mode=never + +#date format +spring.jackson.date-format=yyyy-MM-dd HH:mm:ss +spring.jackson.time-zone=America/New_York + +# Turn off spring boot automation handling +server.error.whitelabel.enabled=false +spring.mvc.throw-exception-if-no-handler-found=true +spring.resources.add-mappings=false