package eu.eudat.controllers.controllerhandler; import eu.eudat.models.data.errormodels.ValidationErrorContext; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.http.HttpStatus; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import java.util.List; import java.util.Locale; @ControllerAdvice public class ControllerValidatorErrorHandler { private MessageSource messageSource; @Autowired public ControllerValidatorErrorHandler(MessageSource messageSource) { this.messageSource = messageSource; } @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public ResponseItem processValidationError(MethodArgumentNotValidException ex) { BindingResult result = ex.getBindingResult(); List fieldErrors = result.getFieldErrors(); return processFieldErrors(fieldErrors); } private ResponseItem processFieldErrors(List fieldErrors) { ValidationErrorContext dto = new ValidationErrorContext(); for (FieldError fieldError : fieldErrors) { String localizedErrorMessage = resolveLocalizedErrorMessage(fieldError); dto.addFieldError(fieldError.getField(), localizedErrorMessage); } return new ResponseItem().status(ApiMessageCode.VALIDATION_MESSAGE).payload(dto); } private String resolveLocalizedErrorMessage(FieldError fieldError) { Locale currentLocale = LocaleContextHolder.getLocale(); String localizedErrorMessage = messageSource.getMessage(fieldError, currentLocale); if (localizedErrorMessage.equals(fieldError.getDefaultMessage())) { String[] fieldErrorCodes = fieldError.getCodes(); localizedErrorMessage = fieldErrorCodes[0]; } return localizedErrorMessage; } }