smartproc-be/src/main/java/com/iconplus/smartproc/exception/ResponseExceptionResolver.java
2023-05-23 11:26:15 +07:00

70 lines
2.7 KiB
Java

package com.iconplus.smartproc.exception;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Log4j2
@Component
public class ResponseExceptionResolver extends AbstractHandlerExceptionResolver {
private static final String DEFAULT_ERROR_CODE = "80000";
public ResponseExceptionResolver() {}
@SneakyThrows
@Override
protected ModelAndView doResolveException(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex
) {
return handleException(request, response, ex);
}
private ModelAndView handleException(
HttpServletRequest request,
HttpServletResponse response,
Exception exception
) {
if (ObjectUtils.isNotEmpty(response) && HttpStatus.UNAUTHORIZED.value() == response.getStatus()
&& ObjectUtils.isNotEmpty(exception) && exception instanceof BusinessException
) {
BusinessException businessException = (BusinessException) exception;
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setCode(businessException.getErrorCode());
errorResponse.setTitle(businessException.getErrorDesc());
errorResponse.setMessage(businessException.getErrorMessage());
log.info("Error Response Exception : {}", errorResponse);
return new ModelAndView(new MappingJackson2JsonView(), this.getErrorResponse(errorResponse));
}
response.setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setCode(DEFAULT_ERROR_CODE);
errorResponse.setTitle("Kesalahan terjadi");
errorResponse.setMessage("Kesalahan terjadi");
return new ModelAndView(new MappingJackson2JsonView(), this.getErrorResponse(errorResponse));
}
private Map<String, String> getErrorResponse(ErrorResponse errorResponse) {
return new ObjectMapper().convertValue(errorResponse, new TypeReference<Map<String, String>>() {
});
}
}