/** * */ package com.teefun.advices; import java.util.ArrayList; import java.util.List; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; 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 com.teefun.advices.bean.ErrorResource; import com.teefun.advices.bean.FieldErrorResource; import com.teefun.exception.JsonErrorException; /** * Handle {@link JsonErrorException} and convert them to json. * * @author Rajh * */ @ControllerAdvice public class JsonExceptionHandler extends ResponseEntityExceptionHandler { /** * Handle json exceptions. * * @param exception the exception * @param request the request * @return the response entity */ @ExceptionHandler({ JsonErrorException.class }) protected ResponseEntity<Object> handleInvalidRequest(final RuntimeException exception, final WebRequest request) { final JsonErrorException ire = (JsonErrorException) exception; final List<FieldErrorResource> fieldErrorResources = new ArrayList<>(); final List<FieldError> fieldErrors = ire.getErrors().getFieldErrors(); for (final FieldError fieldError : fieldErrors) { final FieldErrorResource fieldErrorResource = new FieldErrorResource(); fieldErrorResource.setResource(fieldError.getObjectName()); fieldErrorResource.setField(fieldError.getField()); fieldErrorResource.setCode(fieldError.getCode()); fieldErrorResource.setMessage(fieldError.getDefaultMessage()); fieldErrorResources.add(fieldErrorResource); } final ErrorResource error = new ErrorResource("InvalidRequest", ire.getMessage()); error.setFieldErrors(fieldErrorResources); final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return this.handleExceptionInternal(exception, error, headers, HttpStatus.UNPROCESSABLE_ENTITY, request); } }