MethodArgumentNotValidExceptionResolver.java
package cn.home1.oss.lib.errorhandle.internal.resolver;
import static com.google.common.collect.Lists.newLinkedList;
import cn.home1.oss.lib.errorhandle.api.AbstractConcreteExceptionResolver;
import cn.home1.oss.lib.errorhandle.api.ValidationError;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import java.util.List;
import java.util.Optional;
public class MethodArgumentNotValidExceptionResolver //
  extends AbstractConcreteExceptionResolver<MethodArgumentNotValidException> {
  @Override
  public Optional<List<ValidationError>> validationErrors(final MethodArgumentNotValidException exception) {
    final List<ValidationError> validationErrors = newLinkedList();
    final BindingResult bindingResult = exception.getBindingResult();
    for (final ObjectError err : bindingResult.getGlobalErrors()) {
      validationErrors.add(ValidationError.validationErrorBuilder() //
        .message(err.getDefaultMessage()) //
        .build() //
      );
    }
    for (final FieldError err : bindingResult.getFieldErrors()) {
      final Object rejectedValue = err.getRejectedValue();
      final String rejected = rejectedValue != null ? rejectedValue.toString() : null;
      validationErrors.add(ValidationError.validationErrorBuilder() //
        .field(err.getField()) //
        .rejected(rejected) //
        .message(err.getDefaultMessage()) //
        .build() //
      );
    }
    return Optional.of(validationErrors);
  }
}