Browse Source

refacto error handling

master
art.dambrine 3 years ago
parent
commit
465040bbb5
  1. 3
      build.gradle
  2. 22
      src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java
  3. 16
      src/main/java/com/example/apispringgradleb2boost/exceptionhandling/CustomError.java
  4. 39
      src/main/java/com/example/apispringgradleb2boost/exceptionhandling/GeneralExceptionHandler.java
  5. 34
      src/main/java/com/example/apispringgradleb2boost/exceptions/resolvers/ExceptionResolver.java
  6. 2
      src/main/java/com/example/apispringgradleb2boost/repository/PartnerRepository.java

3
build.gradle

@ -33,7 +33,8 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' 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' implementation 'com.google.code.gson:gson:2.8.9'
} }

22
src/main/java/com/example/apispringgradleb2boost/controller/PartnerController.java

@ -1,20 +1,21 @@
package com.example.apispringgradleb2boost.controller; package com.example.apispringgradleb2boost.controller;
import com.example.apispringgradleb2boost.exceptionhandling.CustomError;
import com.example.apispringgradleb2boost.model.Partner; import com.example.apispringgradleb2boost.model.Partner;
import com.example.apispringgradleb2boost.service.PartnerService; import com.example.apispringgradleb2boost.service.PartnerService;
import com.google.gson.Gson;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import com.google.gson.Gson;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Optional; import java.util.Optional;
@RestController @RestController
@ -23,7 +24,6 @@ public class PartnerController {
@Autowired @Autowired
PartnerService partnerService; PartnerService partnerService;
@GetMapping("/partners") @GetMapping("/partners")
public Iterable<Partner> getPartners() { public Iterable<Partner> getPartners() {
return partnerService.getPartners(); return partnerService.getPartners();
@ -38,17 +38,15 @@ public class PartnerController {
} else { } else {
// Error handling when !partner.isPresent() // Error handling when !partner.isPresent()
response.setStatus(HttpStatus.NOT_FOUND.value()); response.setStatus(HttpStatus.NOT_FOUND.value());
response.setContentType("application/json"); response.setContentType(String.valueOf(MediaType.APPLICATION_JSON));
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
HashMap<String, String> 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(); 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(); out.flush();
return null; return null;
} }
} }

16
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;
}
}

39
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<Object> handleAll(Exception ex, WebRequest request) {
CustomError customError = new CustomError(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getLocalizedMessage());
return new ResponseEntity<Object>(customError, new HttpHeaders(), customError.getCode());
}
@Override
protected ResponseEntity<Object> 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<Object> handleNoHandlerFoundException(
NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
CustomError customError = new CustomError(HttpStatus.NOT_FOUND.value(), ex.getLocalizedMessage());
return new ResponseEntity<Object>(customError, new HttpHeaders(), customError.getCode());
}
}

34
src/main/java/com/example/apispringgradleb2boost/exceptions/resolvers/ExceptionResolver.java

@ -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<String, String> handleException(HttpServletRequest request, Exception e) {
HashMap<String, String> response = new HashMap<>();
response.put("message", e.getMessage());
return response;
}
@ExceptionHandler(MissingPathVariableException.class)
public HashMap<String, String> handleMissingPathVariableException(HttpServletRequest request, MissingPathVariableException e) {
HashMap<String, String> 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<String, String> handleNotFoundResourceException(HttpServletRequest request, NoHandlerFoundException e) {
HashMap<String, String> response = new HashMap<>();
response.put("message", "Requested resource wasn't found on the server");
return response;
}
}

2
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 com.example.apispringgradleb2boost.model.Partner;
import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PartnerRepository extends PagingAndSortingRepository<Partner, Long> { public interface PartnerRepository extends PagingAndSortingRepository<Partner, Long> {
} }

Loading…
Cancel
Save