Introduction
Robust error handling is essential for delivering reliable and secure Spring MVC applications. Out of the box, Spring provides a powerful WebErrorHandler that maps common exceptions to meaningful HTTP status codes and messages. This guide explores Spring’s default behavior, how to customize it, and best practices for building developer-friendly error responses.
Why Spring’s Default Error Handling Matters
Spring MVC’s built-in error handling simplifies debugging and response standardization:
- Automatically maps exceptions to HTTP status codes (e.g., 404, 400).
- Returns structured error payloads for frontend and API clients.
- Improves transparency with helpful error codes and message details.
Common Spring MVC Exception Mappings
Exception Class | HTTP Status | Error Code | Exposed Args |
---|---|---|---|
HttpMessageNotReadableException | 400 | web.invalid_or_missing_body | – |
HttpMediaTypeNotAcceptableException | 406 | web.not_acceptable | Acceptable media types |
HttpRequestMethodNotSupportedException | 405 | web.method_not_allowed | Invalid HTTP method used |
NoHandlerFoundException | 404 | web.no_handler | Requested path |
MissingServletRequestParameterException | 400 | web.missing_parameter | Name/type of missing parameter |
(Others) | 500 | unknown_error | – |
💡 Note: Spring also supports
ResponseStatusException
for setting status codes directly in your code.
Customizing Error Responses
While the default mappings are helpful, you can override them to align with your app’s UX and logging strategy.
✅ Example: Custom Error Response
@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(
HttpMessageNotReadableException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
Map<String, Object> body = Map.of(
"error", "Invalid request body",
"code", "CUSTOM_400"
);
return ResponseEntity.badRequest().body(body);
}
}
🔍 Other Customization Options
- Use
@ExceptionHandler
methods for domain-specific exceptions. - Log errors centrally with SLF4J or Spring AOP.
- Mask internal details for production environments.
Best Practices for Spring Error Handling
✅ 1. Centralize Logic with @ControllerAdvice
Keep error handling consistent across controllers.
✅ 2. Use ResponseStatusException
for Simplicity
No need to create custom exception classes for simple status mappings:
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found");
✅ 3. Hide Sensitive Information
Never expose stack traces or internal exception details in API responses.
✅ 4. Standardize Error Formats
Use consistent fields like error_code
, message
, and timestamp
for easy client parsing.
FAQs
Q1: How can I disable or override Spring’s default WebErrorHandler?
Override relevant methods in ResponseEntityExceptionHandler
or register a custom HandlerExceptionResolver
.
Q2: How do I return custom error codes for my exceptions?
Use @ExceptionHandler
and define your error payload structure.
Q3: Why am I getting a 500 error instead of 400?
Check if your exception is not mapped or lacks a proper @ResponseStatus
annotation.
Conclusion
Spring MVC’s WebErrorHandler
gives you a solid starting point for error handling. But for clean, secure, and well-documented APIs, customization is key. By combining Spring’s built-in features like @ControllerAdvice
and ResponseStatusException
with a few best practices, you can build resilient applications that handle errors gracefully.
Keywords: Spring MVC error handling, WebErrorHandler, ResponseStatusException, @ControllerAdvice, HTTP status Spring, customize Spring exceptions, Spring API error response
💡 Why This Guide Works
- Aligned with Spring Framework 5+ conventions
- Includes real-world code examples
- Practical advice for REST APIs and web apps
Now you’re equipped to master error handling in Spring MVC — and build cleaner, more reliable APIs! 🛠️
Let me know if you want this turned into a downloadable PDF, Markdown blog format, or tailored for documentation sites like SpringDoc/OpenAPI.