Skip to content

Commit 7de0f40

Browse files
committed
Capture exceptions while error resolution
1 parent 807ba08 commit 7de0f40

File tree

13 files changed

+175
-20
lines changed

13 files changed

+175
-20
lines changed

problem4j-spring-webflux/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ dependencies {
1919
compileOnly("org.springframework:spring-web:${property("spring.version")}")
2020
compileOnly("org.springframework:spring-webflux:${property("spring.version")}")
2121
compileOnly("jakarta.validation:jakarta.validation-api:${property("jakarta.validation-api.version")}")
22+
compileOnly("org.slf4j:slf4j-api:2.0.17")
2223

2324
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor:${property("spring-boot.version")}")
2425

problem4j-spring-webflux/src/main/java/io/github/malczuuu/problem4j/spring/webflux/ConstraintViolationExceptionWebFluxAdvice.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package io.github.malczuuu.problem4j.spring.webflux;
22

33
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.PROBLEM_CONTEXT;
4+
import static io.github.malczuuu.problem4j.spring.webflux.WebFluxAdviceSupport.logAdviceException;
45

56
import io.github.malczuuu.problem4j.core.Problem;
7+
import io.github.malczuuu.problem4j.core.ProblemStatus;
68
import io.github.malczuuu.problem4j.spring.web.context.ProblemContext;
79
import io.github.malczuuu.problem4j.spring.web.processor.ProblemPostProcessor;
810
import io.github.malczuuu.problem4j.spring.web.resolver.ConstraintViolationResolver;
911
import io.github.malczuuu.problem4j.spring.web.util.ProblemSupport;
1012
import jakarta.validation.ConstraintViolationException;
1113
import java.util.List;
14+
import org.slf4j.Logger;
15+
import org.slf4j.LoggerFactory;
1216
import org.springframework.http.HttpHeaders;
1317
import org.springframework.http.HttpStatus;
1418
import org.springframework.http.MediaType;
@@ -25,6 +29,9 @@
2529
@RestControllerAdvice
2630
public class ConstraintViolationExceptionWebFluxAdvice {
2731

32+
private static final Logger log =
33+
LoggerFactory.getLogger(ConstraintViolationExceptionWebFluxAdvice.class);
34+
2835
private final ConstraintViolationResolver constraintViolationResolver;
2936
private final ProblemPostProcessor problemPostProcessor;
3037

@@ -54,9 +61,14 @@ public Mono<ResponseEntity<Problem>> handleConstraintViolationException(
5461

5562
HttpStatus status = HttpStatus.BAD_REQUEST;
5663

57-
Problem problem =
58-
constraintViolationResolver.resolveBuilder(context, ex, headers, status).build();
59-
problem = problemPostProcessor.process(context, problem);
64+
Problem problem;
65+
try {
66+
problem = constraintViolationResolver.resolveBuilder(context, ex, headers, status).build();
67+
problem = problemPostProcessor.process(context, problem);
68+
} catch (Exception e) {
69+
logAdviceException(log, ex, exchange, e);
70+
problem = Problem.builder().status(ProblemStatus.INTERNAL_SERVER_ERROR).build();
71+
}
6072

6173
status = ProblemSupport.resolveStatus(problem);
6274

problem4j-spring-webflux/src/main/java/io/github/malczuuu/problem4j/spring/webflux/DecodingExceptionWebFluxAdvice.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package io.github.malczuuu.problem4j.spring.webflux;
22

33
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.PROBLEM_CONTEXT;
4+
import static io.github.malczuuu.problem4j.spring.webflux.WebFluxAdviceSupport.logAdviceException;
45

56
import io.github.malczuuu.problem4j.core.Problem;
67
import io.github.malczuuu.problem4j.core.ProblemStatus;
78
import io.github.malczuuu.problem4j.spring.web.context.ProblemContext;
89
import io.github.malczuuu.problem4j.spring.web.processor.ProblemPostProcessor;
910
import io.github.malczuuu.problem4j.spring.web.util.ProblemSupport;
1011
import java.util.List;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
1114
import org.springframework.core.codec.DecodingException;
1215
import org.springframework.http.HttpHeaders;
1316
import org.springframework.http.HttpStatus;
@@ -32,6 +35,8 @@
3235
@RestControllerAdvice
3336
public class DecodingExceptionWebFluxAdvice {
3437

38+
private static final Logger log = LoggerFactory.getLogger(DecodingExceptionWebFluxAdvice.class);
39+
3540
private final ProblemPostProcessor problemPostProcessor;
3641

3742
private final List<AdviceWebFluxInspector> adviceWebFluxInspectors;
@@ -56,8 +61,14 @@ public Mono<ResponseEntity<Problem>> handleDecodingException(
5661
HttpHeaders headers = new HttpHeaders();
5762
headers.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
5863

59-
Problem problem = Problem.builder().status(ProblemStatus.BAD_REQUEST).build();
60-
problem = problemPostProcessor.process(context, problem);
64+
Problem problem;
65+
try {
66+
problem = Problem.builder().status(ProblemStatus.BAD_REQUEST).build();
67+
problem = problemPostProcessor.process(context, problem);
68+
} catch (Exception e) {
69+
logAdviceException(log, ex, exchange, e);
70+
problem = Problem.builder().status(ProblemStatus.INTERNAL_SERVER_ERROR).build();
71+
}
6172

6273
HttpStatus status = ProblemSupport.resolveStatus(problem);
6374

problem4j-spring-webflux/src/main/java/io/github/malczuuu/problem4j/spring/webflux/ExceptionWebFluxAdvice.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.PROBLEM_CONTEXT;
44
import static io.github.malczuuu.problem4j.spring.web.util.ProblemSupport.resolveStatus;
5+
import static io.github.malczuuu.problem4j.spring.webflux.WebFluxAdviceSupport.logAdviceException;
56

67
import io.github.malczuuu.problem4j.core.Problem;
78
import io.github.malczuuu.problem4j.core.ProblemBuilder;
@@ -13,6 +14,8 @@
1314
import io.github.malczuuu.problem4j.spring.web.resolver.ProblemResolver;
1415
import java.util.List;
1516
import java.util.Optional;
17+
import org.slf4j.Logger;
18+
import org.slf4j.LoggerFactory;
1619
import org.springframework.core.annotation.AnnotatedElementUtils;
1720
import org.springframework.http.HttpHeaders;
1821
import org.springframework.http.HttpStatus;
@@ -44,6 +47,8 @@
4447
@RestControllerAdvice
4548
public class ExceptionWebFluxAdvice {
4649

50+
private static final Logger log = LoggerFactory.getLogger(ExceptionWebFluxAdvice.class);
51+
4752
private final ProblemMappingProcessor problemMappingProcessor;
4853
private final ProblemResolverStore problemResolverStore;
4954
private final ProblemPostProcessor problemPostProcessor;
@@ -73,8 +78,14 @@ public Mono<ResponseEntity<Problem>> handleException(Exception ex, ServerWebExch
7378
HttpHeaders headers = new HttpHeaders();
7479
headers.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
7580

76-
Problem problem = getProblemBuilder(ex, context, headers).build();
77-
problem = problemPostProcessor.process(context, problem);
81+
Problem problem;
82+
try {
83+
problem = getProblemBuilder(ex, context, headers).build();
84+
problem = problemPostProcessor.process(context, problem);
85+
} catch (Exception e) {
86+
logAdviceException(log, ex, exchange, e);
87+
problem = Problem.builder().status(ProblemStatus.INTERNAL_SERVER_ERROR).build();
88+
}
7889

7990
HttpStatus status = resolveStatus(problem);
8091

problem4j-spring-webflux/src/main/java/io/github/malczuuu/problem4j/spring/webflux/ProblemEnhancedWebFluxHandler.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.PROBLEM_CONTEXT;
44
import static io.github.malczuuu.problem4j.spring.web.util.ProblemSupport.resolveStatus;
5+
import static io.github.malczuuu.problem4j.spring.webflux.WebFluxAdviceSupport.logAdviceException;
56

67
import io.github.malczuuu.problem4j.core.Problem;
78
import io.github.malczuuu.problem4j.core.ProblemBuilder;
@@ -10,6 +11,8 @@
1011
import io.github.malczuuu.problem4j.spring.web.context.ProblemContext;
1112
import io.github.malczuuu.problem4j.spring.web.processor.ProblemPostProcessor;
1213
import java.util.List;
14+
import org.slf4j.Logger;
15+
import org.slf4j.LoggerFactory;
1316
import org.springframework.http.HttpHeaders;
1417
import org.springframework.http.HttpStatusCode;
1518
import org.springframework.http.MediaType;
@@ -38,6 +41,8 @@
3841
@RestControllerAdvice
3942
public class ProblemEnhancedWebFluxHandler extends ResponseEntityExceptionHandler {
4043

44+
private static final Logger log = LoggerFactory.getLogger(ProblemEnhancedWebFluxHandler.class);
45+
4146
private final ProblemResolverStore problemResolverStore;
4247
private final ProblemPostProcessor problemPostProcessor;
4348

@@ -73,8 +78,14 @@ protected Mono<ResponseEntity<Object>> handleExceptionInternal(
7378
headers = headers != null ? HttpHeaders.writableHttpHeaders(headers) : new HttpHeaders();
7479
headers.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
7580

76-
Problem problem = getBuilderForOverridingBody(context, ex, headers, status).build();
77-
problem = problemPostProcessor.process(context, problem);
81+
Problem problem;
82+
try {
83+
problem = getBuilderForOverridingBody(context, ex, headers, status).build();
84+
problem = problemPostProcessor.process(context, problem);
85+
} catch (Exception e) {
86+
logAdviceException(log, ex, exchange, e);
87+
problem = Problem.builder().status(ProblemStatus.INTERNAL_SERVER_ERROR).build();
88+
}
7889

7990
status = resolveStatus(problem);
8091

problem4j-spring-webflux/src/main/java/io/github/malczuuu/problem4j/spring/webflux/ProblemExceptionWebFluxAdvice.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package io.github.malczuuu.problem4j.spring.webflux;
22

33
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.PROBLEM_CONTEXT;
4+
import static io.github.malczuuu.problem4j.spring.webflux.WebFluxAdviceSupport.logAdviceException;
45

56
import io.github.malczuuu.problem4j.core.Problem;
67
import io.github.malczuuu.problem4j.core.ProblemException;
8+
import io.github.malczuuu.problem4j.core.ProblemStatus;
79
import io.github.malczuuu.problem4j.spring.web.context.ProblemContext;
810
import io.github.malczuuu.problem4j.spring.web.processor.ProblemPostProcessor;
911
import io.github.malczuuu.problem4j.spring.web.util.ProblemSupport;
1012
import java.util.List;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
1115
import org.springframework.http.HttpHeaders;
1216
import org.springframework.http.HttpStatus;
1317
import org.springframework.http.MediaType;
@@ -28,6 +32,8 @@
2832
@RestControllerAdvice
2933
public class ProblemExceptionWebFluxAdvice {
3034

35+
private static final Logger log = LoggerFactory.getLogger(ProblemExceptionWebFluxAdvice.class);
36+
3137
private final ProblemPostProcessor problemPostProcessor;
3238

3339
private final List<AdviceWebFluxInspector> adviceWebFluxInspectors;
@@ -52,8 +58,14 @@ public Mono<ResponseEntity<Problem>> handleProblemException(
5258
HttpHeaders headers = new HttpHeaders();
5359
headers.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
5460

55-
Problem problem = ex.getProblem();
56-
problem = problemPostProcessor.process(context, problem);
61+
Problem problem;
62+
try {
63+
problem = ex.getProblem();
64+
problem = problemPostProcessor.process(context, problem);
65+
} catch (Exception e) {
66+
logAdviceException(log, ex, exchange, e);
67+
problem = Problem.builder().status(ProblemStatus.INTERNAL_SERVER_ERROR).build();
68+
}
5769

5870
HttpStatus status = ProblemSupport.resolveStatus(problem);
5971

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.github.malczuuu.problem4j.spring.webflux;
2+
3+
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.TRACE_ID;
4+
5+
import org.slf4j.Logger;
6+
import org.springframework.web.server.ServerWebExchange;
7+
8+
class WebFluxAdviceSupport {
9+
10+
static void logAdviceException(
11+
Logger log, Exception ex, ServerWebExchange exchange, Exception e) {
12+
log.warn(
13+
"Unable to resolve problem response (method={}, path={}, traceId={}, message={}, originalException=[{} : {}])",
14+
exchange.getRequest().getMethod(),
15+
exchange.getRequest().getPath(),
16+
exchange.getAttribute(TRACE_ID),
17+
e.getMessage(),
18+
ex.getClass().getName(),
19+
ex.getMessage(),
20+
e);
21+
}
22+
}

problem4j-spring-webmvc/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
compileOnly("org.springframework:spring-webmvc:${property("spring.version")}")
2121
compileOnly("jakarta.validation:jakarta.validation-api:${property("jakarta.validation-api.version")}")
2222
compileOnly("jakarta.servlet:jakarta.servlet-api:${property("jakarta.servlet-api.version")}")
23+
compileOnly("org.slf4j:slf4j-api:2.0.17")
2324

2425
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor:${property("spring-boot.version")}")
2526

problem4j-spring-webmvc/src/main/java/io/github/malczuuu/problem4j/spring/webmvc/ConstraintViolationExceptionMvcAdvice.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package io.github.malczuuu.problem4j.spring.webmvc;
22

33
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.PROBLEM_CONTEXT;
4+
import static io.github.malczuuu.problem4j.spring.webmvc.MvcAdviceSupport.logAdviceException;
45
import static org.springframework.web.context.request.RequestAttributes.SCOPE_REQUEST;
56

67
import io.github.malczuuu.problem4j.core.Problem;
8+
import io.github.malczuuu.problem4j.core.ProblemStatus;
79
import io.github.malczuuu.problem4j.spring.web.context.ProblemContext;
810
import io.github.malczuuu.problem4j.spring.web.processor.ProblemPostProcessor;
911
import io.github.malczuuu.problem4j.spring.web.resolver.ConstraintViolationResolver;
1012
import io.github.malczuuu.problem4j.spring.web.util.ProblemSupport;
1113
import jakarta.validation.ConstraintViolationException;
1214
import java.util.List;
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
1317
import org.springframework.http.HttpHeaders;
1418
import org.springframework.http.HttpStatus;
1519
import org.springframework.http.MediaType;
@@ -25,6 +29,9 @@
2529
@RestControllerAdvice
2630
public class ConstraintViolationExceptionMvcAdvice {
2731

32+
private static final Logger log =
33+
LoggerFactory.getLogger(ConstraintViolationExceptionMvcAdvice.class);
34+
2835
private final ConstraintViolationResolver constraintViolationResolver;
2936
private final ProblemPostProcessor problemPostProcessor;
3037

@@ -56,9 +63,14 @@ public ResponseEntity<Problem> handleConstraintViolationException(
5663

5764
HttpStatus status = HttpStatus.BAD_REQUEST;
5865

59-
Problem problem =
60-
constraintViolationResolver.resolveBuilder(context, ex, headers, status).build();
61-
problem = problemPostProcessor.process(context, problem);
66+
Problem problem;
67+
try {
68+
problem = constraintViolationResolver.resolveBuilder(context, ex, headers, status).build();
69+
problem = problemPostProcessor.process(context, problem);
70+
} catch (Exception e) {
71+
logAdviceException(log, ex, request, e);
72+
problem = Problem.builder().status(ProblemStatus.INTERNAL_SERVER_ERROR).build();
73+
}
6274

6375
status = ProblemSupport.resolveStatus(problem);
6476

problem4j-spring-webmvc/src/main/java/io/github/malczuuu/problem4j/spring/webmvc/ExceptionMvcAdvice.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static io.github.malczuuu.problem4j.spring.web.context.ContextSupport.PROBLEM_CONTEXT;
44
import static io.github.malczuuu.problem4j.spring.web.util.ProblemSupport.resolveStatus;
5+
import static io.github.malczuuu.problem4j.spring.webmvc.MvcAdviceSupport.logAdviceException;
56
import static org.springframework.web.context.request.RequestAttributes.SCOPE_REQUEST;
67

78
import io.github.malczuuu.problem4j.core.Problem;
@@ -15,6 +16,8 @@
1516
import io.github.malczuuu.problem4j.spring.web.util.ProblemSupport;
1617
import java.util.List;
1718
import java.util.Optional;
19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
1821
import org.springframework.core.annotation.AnnotatedElementUtils;
1922
import org.springframework.http.HttpHeaders;
2023
import org.springframework.http.HttpStatus;
@@ -45,6 +48,8 @@
4548
@RestControllerAdvice
4649
public class ExceptionMvcAdvice {
4750

51+
private static final Logger log = LoggerFactory.getLogger(ExceptionMvcAdvice.class);
52+
4853
private final ProblemMappingProcessor problemMappingProcessor;
4954
private final ProblemResolverStore problemResolverStore;
5055
private final ProblemPostProcessor problemPostProcessor;
@@ -76,8 +81,14 @@ public ResponseEntity<Object> handleException(Exception ex, WebRequest request)
7681
HttpHeaders headers = new HttpHeaders();
7782
headers.setContentType(MediaType.APPLICATION_PROBLEM_JSON);
7883

79-
Problem problem = getProblemBuilder(ex, context, headers).build();
80-
problem = problemPostProcessor.process(context, problem);
84+
Problem problem;
85+
try {
86+
problem = getProblemBuilder(ex, context, headers).build();
87+
problem = problemPostProcessor.process(context, problem);
88+
} catch (Exception e) {
89+
logAdviceException(log, ex, request, e);
90+
problem = Problem.builder().status(ProblemStatus.INTERNAL_SERVER_ERROR).build();
91+
}
8192

8293
HttpStatus status = ProblemSupport.resolveStatus(problem);
8394

0 commit comments

Comments
 (0)