67 lines
2.6 KiB
Java
67 lines
2.6 KiB
Java
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.core.annotation.Order;
|
|
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
|
|
@Order(3)
|
|
public class ControllerValidatorErrorHandler {
|
|
|
|
private MessageSource messageSource;
|
|
|
|
@Autowired
|
|
public ControllerValidatorErrorHandler(MessageSource messageSource) {
|
|
this.messageSource = messageSource;
|
|
}
|
|
|
|
@ExceptionHandler(MethodArgumentNotValidException.class)
|
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
|
@ResponseBody
|
|
public ResponseItem<ValidationErrorContext> processValidationError(MethodArgumentNotValidException ex) {
|
|
BindingResult result = ex.getBindingResult();
|
|
List<FieldError> fieldErrors = result.getFieldErrors();
|
|
|
|
return processFieldErrors(fieldErrors);
|
|
}
|
|
|
|
private ResponseItem<ValidationErrorContext> processFieldErrors(List<FieldError> fieldErrors) {
|
|
ValidationErrorContext dto = new ValidationErrorContext();
|
|
|
|
for (FieldError fieldError : fieldErrors) {
|
|
String localizedErrorMessage = resolveLocalizedErrorMessage(fieldError);
|
|
dto.addFieldError(fieldError.getField(), localizedErrorMessage);
|
|
}
|
|
|
|
return new ResponseItem<ValidationErrorContext>().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;
|
|
}
|
|
}
|