diff --git a/build.gradle b/build.gradle index 4695c0f..3a073d1 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,8 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' - // https://mvnrepository.com/artifact/com.google.code.gson/gson + + // Added after spring init implementation 'com.google.code.gson:gson:2.8.9' } diff --git a/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java b/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java index e8adb36..cee04bb 100644 --- a/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java +++ b/src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java @@ -1,20 +1,21 @@ package com.example.apispringgradleb2boost.controller; +import com.example.apispringgradleb2boost.exceptionhandling.CustomError; import com.example.apispringgradleb2boost.model.Partner; import com.example.apispringgradleb2boost.service.PartnerService; -import com.google.gson.Gson; -import lombok.SneakyThrows; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.server.ResponseStatusException; + +import com.google.gson.Gson; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; -import java.util.HashMap; import java.util.Optional; @RestController @@ -23,7 +24,6 @@ public class PartnerController { @Autowired PartnerService partnerService; - @GetMapping("/partners") public Iterable getPartners() { return partnerService.getPartners(); @@ -38,17 +38,15 @@ public class PartnerController { } else { // Error handling when !partner.isPresent() response.setStatus(HttpStatus.NOT_FOUND.value()); - response.setContentType("application/json"); + response.setContentType(String.valueOf(MediaType.APPLICATION_JSON)); response.setCharacterEncoding("UTF-8"); - HashMap responseBody = new HashMap<>(); - responseBody.put("code", String.valueOf(HttpStatus.NOT_FOUND.value())); - responseBody.put("message", String.format("Partner with id %d not found!", Id)); - PrintWriter out = response.getWriter(); - out.print(new Gson().toJson(responseBody)); + out.print(new Gson().toJson( + new CustomError(HttpStatus.NOT_FOUND.value(), + String.format("Partner with id %d not found!", Id)) + )); out.flush(); - return null; } } diff --git a/src/main/java/com/example/apispringgradleb2boost/exceptionhandling/CustomError.java b/src/main/java/com/example/apispringgradleb2boost/exceptionhandling/CustomError.java new file mode 100644 index 0000000..9525d09 --- /dev/null +++ b/src/main/java/com/example/apispringgradleb2boost/exceptionhandling/CustomError.java @@ -0,0 +1,16 @@ +package com.example.apispringgradleb2boost.exceptionhandling; + +import lombok.Data; + +@Data +public class CustomError { + + private int code; + private String message; + + public CustomError(int code, String message) { + this.code = code; + this.message = message; + } + +} diff --git a/src/main/java/com/example/apispringgradleb2boost/exceptionhandling/GeneralExceptionHandler.java b/src/main/java/com/example/apispringgradleb2boost/exceptionhandling/GeneralExceptionHandler.java new file mode 100644 index 0000000..2e21d90 --- /dev/null +++ b/src/main/java/com/example/apispringgradleb2boost/exceptionhandling/GeneralExceptionHandler.java @@ -0,0 +1,39 @@ +package com.example.apispringgradleb2boost.exceptionhandling; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; +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.NoHandlerFoundException; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@ControllerAdvice +public class GeneralExceptionHandler extends ResponseEntityExceptionHandler { + + @ExceptionHandler({Exception.class}) + public ResponseEntity handleAll(Exception ex, WebRequest request) { + CustomError customError = new CustomError(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getLocalizedMessage()); + return new ResponseEntity(customError, new HttpHeaders(), customError.getCode()); + } + + @Override + protected ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotValidException ex, + HttpHeaders headers, + HttpStatus status, + WebRequest request) { + + CustomError customError = new CustomError(HttpStatus.BAD_REQUEST.value(), ex.getLocalizedMessage()); + return handleExceptionInternal(ex, customError, headers, HttpStatus.valueOf(customError.getCode()), request); + } + + @Override + protected ResponseEntity handleNoHandlerFoundException( + NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { + + CustomError customError = new CustomError(HttpStatus.NOT_FOUND.value(), ex.getLocalizedMessage()); + return new ResponseEntity(customError, new HttpHeaders(), customError.getCode()); + } +} diff --git a/src/main/java/com/example/apispringgradleb2boost/exceptions/resolvers/ExceptionResolver.java b/src/main/java/com/example/apispringgradleb2boost/exceptions/resolvers/ExceptionResolver.java deleted file mode 100644 index 8c2f6e8..0000000 --- a/src/main/java/com/example/apispringgradleb2boost/exceptions/resolvers/ExceptionResolver.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.example.apispringgradleb2boost.exceptions.resolvers; - -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.bind.MissingPathVariableException; -import org.springframework.web.servlet.NoHandlerFoundException; - -import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; - -@RestControllerAdvice -public class ExceptionResolver { - - @ExceptionHandler(Exception.class) - public HashMap handleException(HttpServletRequest request, Exception e) { - HashMap response = new HashMap<>(); - response.put("message", e.getMessage()); - return response; - } - - @ExceptionHandler(MissingPathVariableException.class) - public HashMap handleMissingPathVariableException(HttpServletRequest request, MissingPathVariableException e) { - HashMap response = new HashMap<>(); - response.put("message", "Required path variable is missing in this request. Please add it to your request."); - return response; - } - - @ExceptionHandler(NoHandlerFoundException.class) - public HashMap handleNotFoundResourceException(HttpServletRequest request, NoHandlerFoundException e) { - HashMap response = new HashMap<>(); - response.put("message", "Requested resource wasn't found on the server"); - return response; - } -} diff --git a/src/main/java/com/example/apispringgradleb2boost/repository/PartnerRepository.java b/src/main/java/com/example/apispringgradleb2boost/repository/PartnerRepository.java index 86e0ca5..1ce59e7 100644 --- a/src/main/java/com/example/apispringgradleb2boost/repository/PartnerRepository.java +++ b/src/main/java/com/example/apispringgradleb2boost/repository/PartnerRepository.java @@ -2,6 +2,8 @@ package com.example.apispringgradleb2boost.repository; import com.example.apispringgradleb2boost.model.Partner; import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.stereotype.Repository; +@Repository public interface PartnerRepository extends PagingAndSortingRepository { }