🔴 The Error You're Seeing

Confirm this matches your console output. If it does, you're in the right place.

ERROR LOG2026-03-01 12:20:10.800 WARN 8842 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' from value 'abc' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "abc"]

⚡ Quick Fix Works 80% of the time

Ensure the client sends a numeric value in the URL, or handle the exception globally.

@GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { ... } // Client must call: /users/123 (NOT /users/abc)

🧠 Why this Happens

Tap to expand the deep technical explanation

Your @PathVariable is declared as a numeric type (like Long or Integer), but the actual text in the URL was a non-numeric string (like 'abc'). Spring tried to convert 'abc' to a Long, failed, and threw this exception.

The HITEC City Parking Spot Analogy:

Imagine a parking garage that only accepts cars. A motorcycle tries to enter, but the barrier sensor (Spring) can't convert 'motorcycle' into a 'car' type, so it refuses entry.

🔁 How to Reproduce Confirm this is your error

Call a route like /users/abc where the @PathVariable is typed as Long. Spring cannot convert 'abc' and throws TypeMismatchException: Failed to convert value of type String to required type Long.

🛠️ Solutions (3 Ways to Fix)

Solution 1✓ Most common cause

Fix the client URL

👉 Use this if the client is sending a string where an integer/long is expected.

If your @PathVariable is of type Long, the URL must contain a valid number. 'abc' cannot be converted to a Long.

// Controller @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { ... } // Correct Client Call GET /users/123 // Wrong Client Call GET /users/abc
Solution 2

Handle the exception globally

👉 Use this to return a clean JSON error instead of Spring's default 400 HTML page.

Create a global exception handler to catch MethodArgumentTypeMismatchException and return a friendly message.

@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentTypeMismatchException.class) public ResponseEntity<String> handleTypeMismatch(MethodArgumentTypeMismatchException ex) { return ResponseEntity.badRequest().body("Invalid ID format. Must be a number."); } }
Solution 3

Use String and parse manually

👉 Use this if you want custom validation logic on the ID.

Accept the path variable as a String, then try to parse it to a Long inside your method, handling the exception yourself.

@GetMapping("/users/{id}") public ResponseEntity<?> getUser(@PathVariable String id) { try { Long longId = Long.parseLong(id); return ResponseEntity.ok(userService.getUser(longId)); } catch (NumberFormatException e) { return ResponseEntity.badRequest().body("ID must be numeric"); } }

📋 Version Notes

Spring Boot 2.x

Throws MethodArgumentTypeMismatchException.

Spring Boot 3.x

Throws MethodArgumentTypeMismatchException, sometimes wrapped in ProblemDetail.

🛡️ How to Prevent This Next Time

Ensure frontend APIs construct URLs with the correct data types. Always handle TypeMismatchException globally to avoid exposing stack traces.