Skip to content

Commit 84797b5

Browse files
committed
BENCH-155 add validation exception with error map
1 parent 1482f1f commit 84797b5

12 files changed

+75
-42
lines changed

src/main/java/com/answerdigital/answerking/exception/AnswerKingException.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.answerdigital.answerking.exception;
22

33
import java.util.Collection;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
47
import lombok.Getter;
58
import org.springframework.http.HttpStatus;
69

@@ -15,20 +18,36 @@ public abstract class AnswerKingException extends RuntimeException {
1518

1619
private final String detail;
1720

18-
private final Collection<String> errors;
21+
private final Map<String, Collection<String>> errors = new HashMap<>();
22+
private final String error;
1923

2024
protected AnswerKingException(
2125
final String type,
2226
final String title,
2327
final HttpStatus status,
2428
final String detail,
25-
final Collection<String> errors
29+
final Map<String, Collection<String>> errors
2630
) {
2731
super(errors.toString());
2832
this.type = type;
2933
this.title = title;
3034
this.status = status;
3135
this.detail = detail;
32-
this.errors = errors;
36+
this.errors.putAll(errors);
37+
this.error = "";
38+
}
39+
protected AnswerKingException(
40+
final String type,
41+
final String title,
42+
final HttpStatus status,
43+
final String detail,
44+
final String error
45+
) {
46+
super(error);
47+
this.type = type;
48+
this.title = title;
49+
this.status = status;
50+
this.detail = detail;
51+
this.error = error;
3352
}
3453
}

src/main/java/com/answerdigital/answerking/exception/custom/NameUnavailableException.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
import java.util.Collection;
66

77
public class NameUnavailableException extends BadRequestException {
8-
public NameUnavailableException(final Collection<String> errors) {
9-
super(errors);
10-
}
118

129
public NameUnavailableException(final String error) {
1310
super(error);

src/main/java/com/answerdigital/answerking/exception/custom/ProductAlreadyPresentException.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
import java.util.Collection;
66

77
public class ProductAlreadyPresentException extends BadRequestException {
8-
public ProductAlreadyPresentException(final Collection<String> errors) {
9-
super(errors);
10-
}
118

129
public ProductAlreadyPresentException(final String error) {
1310
super(error);

src/main/java/com/answerdigital/answerking/exception/custom/RetirementException.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@ public class RetirementException extends AnswerKingException {
1616

1717
private static final String DETAIL = null;
1818

19-
public RetirementException(final Collection<String> errors) {
19+
public RetirementException(final String errors) {
2020
super(TYPE, TITLE, STATUS, DETAIL, errors);
2121
}
2222

23-
public RetirementException(final String error) {
24-
this(List.of(error));
25-
}
2623
}

src/main/java/com/answerdigital/answerking/exception/generic/BadRequestException.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.Collection;
77
import java.util.List;
8+
import java.util.Map;
89

910
public class BadRequestException extends AnswerKingException {
1011

@@ -16,11 +17,10 @@ public class BadRequestException extends AnswerKingException {
1617

1718
private static final String DETAIL = null;
1819

19-
public BadRequestException(final Collection<String> errors) {
20-
super(TYPE, TITLE, STATUS, DETAIL, errors);
21-
}
22-
2320
public BadRequestException(final String error) {
24-
this(List.of(error));
21+
super(TYPE, TITLE, STATUS, DETAIL, error);
22+
}
23+
public BadRequestException(final Map<String, Collection<String>> errors, String detail) {
24+
super(TYPE, TITLE, STATUS, detail, errors);
2525
}
2626
}

src/main/java/com/answerdigital/answerking/exception/generic/ConflictException.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@ public class ConflictException extends AnswerKingException {
1616

1717
private static final String DETAIL = null;
1818

19-
public ConflictException(final Collection<String> errors) {
19+
public ConflictException(final String errors) {
2020
super(TYPE, TITLE, STATUS, DETAIL, errors);
2121
}
2222

23-
public ConflictException(final String error) {
24-
this(List.of(error));
25-
}
2623
}

src/main/java/com/answerdigital/answerking/exception/generic/InternalServerErrorException.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@ public class InternalServerErrorException extends AnswerKingException {
1616

1717
private static final String DETAIL = null;
1818

19-
public InternalServerErrorException(final Collection<String> errors) {
19+
public InternalServerErrorException(final String errors) {
2020
super(TYPE, TITLE, STATUS, DETAIL, errors);
2121
}
2222

23-
public InternalServerErrorException(final String error) {
24-
this(List.of(error));
25-
}
2623
}

src/main/java/com/answerdigital/answerking/exception/generic/NotFoundException.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,8 @@ public class NotFoundException extends AnswerKingException {
1616

1717
private static final String DETAIL = null;
1818

19-
public NotFoundException(final Collection<String> errors) {
19+
public NotFoundException(final String errors) {
2020
super(TYPE, TITLE, STATUS, DETAIL, errors);
2121
}
2222

23-
public NotFoundException(final String error) {
24-
this(List.of(error));
25-
}
2623
}

src/main/java/com/answerdigital/answerking/exception/util/ErrorResponse.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import javax.servlet.http.HttpServletRequest;
88
import java.util.Collection;
9+
import java.util.HashMap;
10+
import java.util.Map;
911

1012
@Slf4j
1113
@Getter
@@ -21,22 +23,35 @@ public class ErrorResponse {
2123

2224
private final String instance;
2325

24-
private final Collection<String> errors;
26+
private final Map<String, Collection<String>> errors = new HashMap<>();
2527

2628
private final String traceId;
2729

28-
public ErrorResponse(final AnswerKingException exception, final HttpServletRequest request) {
30+
public ErrorResponse(final AnswerKingException exception, final HttpServletRequest request, boolean validtionProblem) {
2931
this.type = exception.getType();
3032
this.title = exception.getTitle();
3133
this.status = exception.getStatus().value();
3234
this.detail = exception.getDetail();
3335
this.instance = request.getRequestURI();
34-
this.errors = exception.getErrors();
36+
this.errors.putAll(exception.getErrors());
3537
this.traceId = CorrelationId.getId();
3638

3739
log.error(String.format(
3840
"RETURNING EXCEPTION - TYPE: %s - TITLE: %s - STATUS: %s - DETAIL: %s - INSTANCE: %s - ERRORS: %s - TRACEID: %s",
3941
type, title, status, detail, instance, errors.toString(), traceId)
4042
);
4143
}
44+
public ErrorResponse(final AnswerKingException exception, final HttpServletRequest request) {
45+
this.type = exception.getType();
46+
this.title = exception.getTitle();
47+
this.status = exception.getStatus().value();
48+
this.detail = exception.getError();
49+
this.instance = request.getRequestURI();
50+
this.traceId = CorrelationId.getId();
51+
52+
log.error(String.format(
53+
"RETURNING EXCEPTION - TYPE: %s - TITLE: %s - STATUS: %s - DETAIL: %s - INSTANCE: %s - TRACEID: %s",
54+
type, title, status, detail, instance, traceId)
55+
);
56+
}
4257
}

src/main/java/com/answerdigital/answerking/exception/util/RestResponseEntityExceptionHandler.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
import javax.servlet.http.HttpServletRequest;
1313
import javax.validation.ConstraintViolation;
1414
import javax.validation.ConstraintViolationException;
15-
import java.util.List;
15+
import java.util.ArrayList;
16+
import java.util.Collection;
17+
import java.util.HashMap;
18+
import java.util.Map;
1619
import java.util.Objects;
20+
import java.util.stream.StreamSupport;
1721

1822
@RestControllerAdvice
1923
public class RestResponseEntityExceptionHandler {
@@ -39,11 +43,24 @@ public ResponseEntity<ErrorResponse> handleConstraintViolationException(
3943
final ConstraintViolationException exception,
4044
final HttpServletRequest request ) {
4145

42-
final List<String> errorMessages = exception.getConstraintViolations().stream()
43-
.map(ConstraintViolation::getMessage)
44-
.toList();
4546

46-
final ErrorResponse response = new ErrorResponse(new BadRequestException(errorMessages), request);
47+
Map<String, Collection<String>> newMap = new HashMap<>();
48+
for (ConstraintViolation<?> constraintViolation : exception.getConstraintViolations()) {
49+
String mapKey = Objects.requireNonNull(StreamSupport
50+
.stream(constraintViolation.getPropertyPath().spliterator(), false)
51+
.reduce((first, second) -> second)
52+
.orElse(null)).toString();
53+
54+
if(newMap.containsKey(mapKey)){
55+
newMap.get(mapKey).add(constraintViolation.getMessage());
56+
} else {
57+
Collection<String> newCollection = new ArrayList<>();
58+
newCollection.add(constraintViolation.getMessage());
59+
newMap.put(mapKey, newCollection);
60+
}
61+
}
62+
63+
final ErrorResponse response = new ErrorResponse(new BadRequestException(newMap, "One or more validation errors occurred"), request, true);
4764
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
4865
}
4966

0 commit comments

Comments
 (0)