Skip to content
Snippets Groups Projects
Commit 8b5bad8e authored by Rustam Lotsmanenko (EPAM)'s avatar Rustam Lotsmanenko (EPAM)
Browse files

Merge branch 'EPMOSDU-1635-Donate-fix-for-order-error-messages' into 'master'

EPMOSDU-1635-Donate-fix-for-order-error-messages

See merge request !1001
parents 70ff4bc0 ae91f5ef
No related branches found
No related tags found
1 merge request!1001EPMOSDU-1635-Donate-fix-for-order-error-messages
Pipeline #312638 failed
......@@ -27,6 +27,7 @@ import com.google.gson.JsonPrimitive;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.ValidationException;
import java.util.Comparator;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.opengroup.osdu.core.common.exception.NotFoundException;
......@@ -45,6 +46,7 @@ import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.lang.NonNull;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
......@@ -201,7 +203,11 @@ public class GlobalExceptionMapper extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
BindingResult bindingResult = ex.getBindingResult();
String errorMessage = bindingResult.getAllErrors().get(0).getDefaultMessage();
String errorMessage = bindingResult.getAllErrors()
.stream()
.sorted(Comparator.comparing(ObjectError::getDefaultMessage, Comparator.nullsFirst(String::compareTo)))
.toList()
.get(0).getDefaultMessage();
return this.getErrorResponse(
new AppException(HttpStatus.BAD_REQUEST.value(), "Validation error.",errorMessage));
}
......
......@@ -17,9 +17,12 @@ package org.opengroup.osdu.storage.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
import jakarta.validation.ValidationException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
......@@ -28,12 +31,19 @@ import org.opengroup.osdu.core.common.exception.NotFoundException;
import org.opengroup.osdu.core.common.logging.JaxRsDpsLog;
import org.opengroup.osdu.core.common.model.http.AppError;
import org.opengroup.osdu.core.common.model.http.AppException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import java.io.IOException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.context.request.WebRequest;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class GlobalExceptionMapperTest {
......@@ -126,4 +136,30 @@ public class GlobalExceptionMapperTest {
assertEquals(HttpStatus.SC_SERVICE_UNAVAILABLE, response.getStatusCodeValue());
}
@Test
public void should_returnSortedErrorMessages_when_MethodArgumentNotValidExceptionCaptured() {
//given
HttpHeaders headers = null;
HttpStatusCode status = null;
WebRequest request = null;
BindingResult bindingResult = Mockito.spy(BindingResult.class);
MethodArgumentNotValidException ex = Mockito.mock(MethodArgumentNotValidException.class);
ArgumentCaptor<String> errorMessage = ArgumentCaptor.forClass(String.class);
ArgumentCaptor<AppException> appException = ArgumentCaptor.forClass(AppException.class);
List<ObjectError> objectErrors = new ArrayList<>();
objectErrors.add(new ObjectError("", "B_defaultMessage"));
objectErrors.add(new ObjectError("", "C_defaultMessage"));
String aDefaultMessage = "A_defaultMessage"; // inserted into a list as not a first parameter
objectErrors.add(new ObjectError("", aDefaultMessage));
objectErrors.add(new ObjectError("", "D_defaultMessage"));
// when
when(ex.getBindingResult()).thenReturn(bindingResult);
when(bindingResult.getAllErrors()).thenReturn(objectErrors);
// then trigger logic and capture values
this.sut.handleMethodArgumentNotValid(ex, headers, status, request);
verify(logger).warning(errorMessage.capture(), appException.capture());
assertEquals(aDefaultMessage, errorMessage.getValue());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment