Commit edb8e3a5 authored by Filip Filchev's avatar Filip Filchev
Browse files

Add Global Exception Handler. Delete unused Exceptions

No related merge requests found
Showing with 92 additions and 78 deletions
+92 -78
......@@ -7,7 +7,7 @@ import org.springframework.stereotype.Controller;
import studentmanagement.api.cli.formatter.CoursesOutputFormatter;
import studentmanagement.model.course.dto.CourseStudentListDto;
import studentmanagement.model.dto.create.AddGradeRequest;
import studentmanagement.model.grade.dto.GradeEntry;
import studentmanagement.model.dto.GradeEntry;
import studentmanagement.model.key.IDableKey;
import studentmanagement.service.grade.GradeService;
......
package studentmanagement.api.rest.exception;
import java.time.LocalDateTime;
public record ExceptionInformation(String message, int statusCode, LocalDateTime time, String url) {
}
package studentmanagement.api.rest.exception;
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;
import studentmanagement.model.course.exception.StudentNotInCourseException;
import studentmanagement.model.course.exception.TeacherNotInCourseException;
import studentmanagement.service.generic.exception.IDableDoesNotExistException;
import java.time.LocalDateTime;
@ControllerAdvice
public class GlobalExceptionHandlerController extends ResponseEntityExceptionHandler {
@ExceptionHandler({IllegalArgumentException.class})
public ResponseEntity<Object> handleIllegalArgumentException(IllegalArgumentException e, WebRequest request) {
ExceptionInformation exceptionInformation = new ExceptionInformation(
e.getMessage(),
HttpStatus.UNPROCESSABLE_ENTITY.value(),
LocalDateTime.now(),
request.getDescription(false)
);
return this.handleExceptionInternal(e, exceptionInformation, new HttpHeaders(), HttpStatus.UNPROCESSABLE_ENTITY,
request);
}
@ExceptionHandler({IDableDoesNotExistException.class})
public ResponseEntity<Object> handleIllegalArgumentException(IDableDoesNotExistException e, WebRequest request) {
ExceptionInformation exceptionInformation = new ExceptionInformation(
e.getMessage(),
HttpStatus.NOT_FOUND.value(),
LocalDateTime.now(),
request.getDescription(false)
);
return this.handleExceptionInternal(e, exceptionInformation, new HttpHeaders(), HttpStatus.UNPROCESSABLE_ENTITY,
request);
}
@ExceptionHandler({TeacherNotInCourseException.class})
public ResponseEntity<Object> handleIllegalArgumentException(TeacherNotInCourseException e, WebRequest request) {
ExceptionInformation exceptionInformation = new ExceptionInformation(
e.getMessage(),
HttpStatus.BAD_REQUEST.value(),
LocalDateTime.now(),
request.getDescription(false)
);
return this.handleExceptionInternal(e, exceptionInformation, new HttpHeaders(), HttpStatus.BAD_REQUEST,
request);
}
@ExceptionHandler({StudentNotInCourseException.class})
public ResponseEntity<Object> handleIllegalArgumentException(StudentNotInCourseException e, WebRequest request) {
ExceptionInformation exceptionInformation = new ExceptionInformation(
e.getMessage(),
HttpStatus.BAD_REQUEST.value(),
LocalDateTime.now(),
request.getDescription(false)
);
return this.handleExceptionInternal(e, exceptionInformation, new HttpHeaders(), HttpStatus.BAD_REQUEST,
request);
}
}
\ No newline at end of file
......@@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
......@@ -13,7 +12,7 @@ import studentmanagement.api.rest.API;
import studentmanagement.model.course.dto.CourseStudentListDto;
import studentmanagement.model.dto.create.AddGradeRequest;
import studentmanagement.model.dto.response.GradeDto;
import studentmanagement.model.grade.dto.GradeEntry;
import studentmanagement.model.dto.GradeEntry;
import studentmanagement.model.key.IDableKey;
import studentmanagement.service.grade.GradeService;
......
package studentmanagement.service.course.exception;
public class CourseAlreadyExistsException extends Exception {
public CourseAlreadyExistsException(String message) {
super(message);
}
}
package studentmanagement.service.course.exception;
public class CourseDoesNotExistException extends RuntimeException {
public CourseDoesNotExistException(String message) {
super(message);
}
}
\ No newline at end of file
......@@ -11,7 +11,7 @@ import studentmanagement.model.dto.response.CourseIdNameDto;
import studentmanagement.model.dto.response.GradeDto;
import studentmanagement.model.dto.response.StudentIdNameDto;
import studentmanagement.model.grade.Grade;
import studentmanagement.model.grade.dto.GradeEntry;
import studentmanagement.model.dto.GradeEntry;
import studentmanagement.model.key.IDableKey;
import studentmanagement.model.person.student.Student;
import studentmanagement.service.course.CourseService;
......
package studentmanagement.service.grade;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import studentmanagement.model.dto.create.AddGradeRequest;
import studentmanagement.model.dto.response.GradeDto;
import studentmanagement.model.grade.Grade;
......@@ -8,6 +9,7 @@ import studentmanagement.model.grade.Grade;
@Mapper(componentModel = "spring")
public interface GradeMapper {
@Mapping(target = "id", ignore = true)
GradeDto gradeToGradeDto(Grade grade);
Grade addGradeRequestToGrade(AddGradeRequest request);
......
......@@ -4,7 +4,7 @@ import studentmanagement.model.course.dto.CourseStudentListDto;
import studentmanagement.model.dto.create.AddGradeRequest;
import studentmanagement.model.dto.response.GradeDto;
import studentmanagement.model.grade.Grade;
import studentmanagement.model.grade.dto.GradeEntry;
import studentmanagement.model.dto.GradeEntry;
import studentmanagement.model.key.IDableKey;
import java.util.Collection;
......
package studentmanagement.service.grade.exception;
public class GradeTableAlreadyExistsException extends Exception {
public GradeTableAlreadyExistsException(String message) {
super(message);
}
}
package studentmanagement.service.grade.exception;
public class GradeTableDoesNotExistsException extends Exception {
public GradeTableDoesNotExistsException(String message) {
super(message);
}
}
package studentmanagement.service.student.exception;
public class StudentAlreadyExistsException extends Exception {
public StudentAlreadyExistsException(String message) {
super(message);
}
}
package studentmanagement.service.student.exception;
public class StudentDoesNotExistException extends Exception {
public StudentDoesNotExistException(String message) {
super(message);
}
}
\ No newline at end of file
......@@ -15,5 +15,7 @@ public interface TeacherMapper {
TeacherIdNameDto teacherToTeacherIdNameDto(Teacher teacher);
@Mapping(target = "id", ignore = true)
@Mapping(target = "age", ignore = true)
TeacherCreateResponse teacherToTeacherCreateResponse(Teacher teacher);
}
package studentmanagement.service.teacher.exception;
public class TeacherAlreadyExistsException extends Exception {
public TeacherAlreadyExistsException(String message) {
super(message);
}
}
\ No newline at end of file
package studentmanagement.service.teacher.exception;
public class TeacherDoesNotExistException extends Exception {
public TeacherDoesNotExistException(String message) {
super(message);
}
}
......@@ -5,7 +5,6 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import studentmanagement.model.course.Course;
import studentmanagement.model.course.exception.StudentAlreadyInCourseException;
import studentmanagement.model.course.exception.StudentNotInCourseException;
import studentmanagement.model.course.exception.TeacherNotInCourseException;
import studentmanagement.model.dto.create.StudentCourseIdRequest;
......@@ -18,7 +17,6 @@ import studentmanagement.model.person.teacher.Degree;
import studentmanagement.model.person.teacher.Teacher;
import studentmanagement.service.course.CourseService;
import studentmanagement.service.generic.exception.IDableDoesNotExistException;
import studentmanagement.service.grade.exception.GradeTableDoesNotExistsException;
import studentmanagement.service.student.StudentService;
import studentmanagement.service.teacher.TeacherService;
......@@ -77,8 +75,7 @@ class DefaultAdministratorServiceTest {
@Test
void enroll_Throws_IDableDoesNotExistException_If_Course_Not_Found()
throws IDableDoesNotExistException,
StudentAlreadyInCourseException {
throws IDableDoesNotExistException {
Mockito.when(courseServiceMock.findById(courseKey)).thenThrow(
new IDableDoesNotExistException("Course not found")
......@@ -93,7 +90,7 @@ class DefaultAdministratorServiceTest {
@Test
void dismiss_Dismisses_Student_Correctly()
throws IDableDoesNotExistException,
StudentNotInCourseException, StudentAlreadyInCourseException {
StudentNotInCourseException {
StudentCourseResponse expected = new StudentCourseResponse(student, course);
Mockito.when(courseServiceMock.findById(courseKey)).thenReturn(course);
......@@ -109,7 +106,7 @@ class DefaultAdministratorServiceTest {
@Test
void dismiss_Throws_StudentNotInCourseException()
throws IDableDoesNotExistException, GradeTableDoesNotExistsException {
throws IDableDoesNotExistException {
Mockito.when(courseServiceMock.findById(courseKey)).thenReturn(course);
Mockito.when(studentServiceMock.findById(studentKey)).thenReturn(student);
......
......@@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import studentmanagement.data.teacher.TeacherRepository;
import studentmanagement.model.dto.create.TeacherCreateRequest;
import studentmanagement.model.person.exception.InvalidDegreeException;
import studentmanagement.model.person.teacher.Degree;
import studentmanagement.model.person.teacher.Teacher;
......@@ -21,7 +20,7 @@ class DefaultTeacherServiceTest {
}
@Test
void add_Adds_Teacher_Correctly() throws InvalidDegreeException {
void add_Adds_Teacher_Correctly() {
long id = 1L;
String name = "Filip";
Degree degree = Degree.PHD;
......
......@@ -38,9 +38,4 @@ public abstract class DefaultIDable implements IDable {
public int hashCode() {
return id.hashCode();
}
@Override
public String toString() {
return name + " - " + id;
}
}
......@@ -12,7 +12,6 @@ import lombok.Getter;
import lombok.Setter;
import org.hibernate.Hibernate;
import studentmanagement.model.DefaultIDable;
import studentmanagement.model.course.exception.StudentAlreadyInCourseException;
import studentmanagement.model.course.exception.StudentNotInCourseException;
import studentmanagement.model.course.exception.TeacherNotInCourseException;
import studentmanagement.model.person.student.Student;
......@@ -50,7 +49,8 @@ public class Course extends DefaultIDable implements Comparable<Course> {
public void fire(Teacher teacher) throws TeacherNotInCourseException {
if (!this.teacher.equals(teacher)) {
throw new TeacherNotInCourseException("Teacher: " + teacher + " is no employed in this Course");
throw new TeacherNotInCourseException(
"Teacher with ID: " + teacher.getId() + " is no employed in this Course");
}
this.teacher = null;
}
......@@ -59,7 +59,6 @@ public class Course extends DefaultIDable implements Comparable<Course> {
* Adds a new Student to the Course
*
* @param student - the new Student
* @throws StudentAlreadyInCourseException - if the Student is already in the Course
*/
public Student enroll(Student student) {
students.add(student);
......@@ -89,7 +88,8 @@ public class Course extends DefaultIDable implements Comparable<Course> {
private void validateStudentInCourse(Student student) throws StudentNotInCourseException {
if (!isEnrolled(student)) {
throw new StudentNotInCourseException("Student: " + student + " is not in the Course: " + getName());
throw new StudentNotInCourseException(
"Student wth ID: " + student.getId() + " is not enrolled in this Course");
}
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment