If you’re building REST APIs using Spring Boot, you may encounter a strange and frustrating issue:
❓ The request JSON clearly sends a boolean value (true / false),
but inside the DTO, the value becomes null.
- No exception.
- No warning.
- No stack trace.
This is not a bug in Spring Boot — it’s a Jackson + Java Bean naming trap that frequently appears in real-world applications.
In this article, you’ll learn:
- - Why boolean values become null in Spring Boot DTOs
- - How Jackson maps JSON properties to Java fields
- - Why @JsonProperty fixes the issue
- - The recommended best practice to avoid this forever
The Problem: Boolean Value Is null in DTO
Consider this request payload sent from the frontend:
{
"isActive": true
}
Now look at the DTO:
public class UserRequest {
private Boolean isActive;
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
}
Controller code:
@PostMapping("/user")
public void createUser(@RequestBody UserRequest request) {
System.out.println(request.getIsActive());
}
Actual Output
null
❌ JSON is correct
❌ Mapping fails silently
❌ Debugging becomes painful
Why This Happens (Jackson + Java Bean Rules)
Spring Boot uses Jackson to convert JSON into Java objects.
Jackson does not rely only on field names — it follows Java Bean naming conventions, which depend heavily on getter and setter names.
How Jackson Interprets Boolean Fields
For this field:
private Boolean isActive;
Jackson expects one of these method patterns:
public Boolean isActive()
or
public Boolean getActive()
But what we actually wrote:
public Boolean getIsActive()
The Mismatch
JSON property: isActive
Java property Jackson infers: active
Because of this mismatch, Jackson fails to bind the value — resulting in null.
Solution 1: Use @JsonProperty (Quick Fix)
You can explicitly tell Jackson how to map the JSON property.
Fixed DTO Using @JsonProperty
import com.fasterxml.jackson.annotation.JsonProperty;
public class UserRequest {
@JsonProperty("isActive")
private Boolean isActive;
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
}
Result
✔ JSON maps correctly
✔ DTO receives true / false
✔ No more null
Solution 2: Best Practice (Highly Recommended)
Instead of fixing the mapping, fix the design.
Avoid starting boolean field names with is.
Preferred DTO Design
public class UserRequest {
private Boolean active;
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
}
Why This Is Better
Fully Java Bean compliant
- No Jackson annotations required
- Cleaner, more readable DTOs
- Fewer bugs in large codebases
boolean vs Boolean in Spring Boot DTOs
| Type | Default Value | Nullable |
|---|---|---|
| boolean | false | No |
| Boolean | null | Yes |
When to Use What
- Use boolean when the field is mandatory
- Use Boolean when the field is optional or tri-state
Common Interview Question
Q: Why does Spring Boot map boolean JSON values to null?
Answer:
Because Jackson follows Java Bean naming conventions. Boolean fields prefixed with is can cause property name mismatches unless getters, setters, or @JsonProperty are defined correctly.
Key Takeaways
- Boolean fields starting with is can silently break Jackson mapping
- Jackson relies on getter/setter naming, not field names
- @JsonProperty fixes the issue explicitly
- Best practice: avoid is prefix in DTO fields
- Always check DTO design before debugging controllers
Final Advice
If your JSON looks correct but your DTO value is null:
👉 Check the getter and setter naming first.
This small detail can save hours of debugging in Spring Boot applications.
Top comments (0)