Boolean Field Becomes null in Spring Boot DTO? Here’s Why (And How to Fix It)
Source: Dev.to

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
@JsonPropertyfixes the issue - The recommended best practice to avoid this forever
The Problem: Boolean Value Is null in DTO
Request payload
{
"isActive": true
}
DTO
public class UserRequest {
private Boolean isActive;
public Boolean getIsActive() {
return isActive;
}
public void setIsActive(Boolean isActive) {
this.isActive = isActive;
}
}
Controller
@PostMapping("/user")
public void createUser(@RequestBody UserRequest request) {
System.out.println(request.getIsActive());
}
Actual output
null
Why This Happens (Jackson + Java Bean Rules)
Spring Boot uses Jackson to convert JSON into Java objects. Jackson follows Java Bean naming conventions, which depend heavily on getter and setter names.
How Jackson interprets boolean fields
For a field declared as:
private Boolean isActive;
Jackson expects one of the following method patterns:
public Boolean isActive() // for primitive boolean
// or
public Boolean getActive()
But the DTO defines:
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)
Explicitly tell Jackson how to map the JSON property.
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
booleanwhen the field is mandatory. - Use
Booleanwhen the field is optional or tri‑state.
Common Interview Question
Q: Why does Spring Boot map boolean JSON values to null?
A: 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
iscan silently break Jackson mapping. - Jackson relies on getter/setter naming, not field names.
@JsonPropertyfixes the issue explicitly.- Best practice: avoid the
isprefix 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.