99 lines
8.0 KiB
Markdown
99 lines
8.0 KiB
Markdown
---
|
|
title: Jackson DeserializationFeature — unknown field & null handling
|
|
source_type: official-doc
|
|
url: https://fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/DeserializationFeature.html
|
|
archive_url:
|
|
status: raw
|
|
confidence: high
|
|
tags: [ca-tmpl, schema, serialization, jackson, json, unknown-field]
|
|
related_projects: [ca-tmpl]
|
|
related_branches: [feature-schema-serialization-contract]
|
|
created: 2026-05-22
|
|
last_reviewed: 2026-05-27
|
|
---
|
|
|
|
# Jackson DeserializationFeature — unknown field & null handling
|
|
|
|
> Layer: `raw/official-docs/` — Jackson 2.13 공식 Javadoc 의 `DeserializationFeature` enum 원문 발췌. ca-tmpl `unknown field strict inbound / tolerant outbound` + `null/empty/missing 의미 분리` 결정의 구현 근거.
|
|
|
|
## Parent / 활용 branch (필수)
|
|
|
|
| Branch | 이 자료가 정당화하는 결정 |
|
|
|---|---|
|
|
| [[raw/branch-notes/feature-schema-serialization-contract]] | G-F 대안 1 (Jackson default = strict on unknown by default) 의 1차 근거 + `FAIL_ON_NULL_FOR_PRIMITIVES` default=disabled 가 ca-tmpl 의 "null/empty/missing 분리" 요구와 불일치한다는 사실 + 보강 (wrapper / 명시 토글) 필요성 |
|
|
|
|
## 컨텍스트
|
|
|
|
ca-tmpl Decisionized Work Items 가 `request unknown field -> fail-fast` + `response schema 없는 field 노출 금지` + `null/empty/missing 의미 분리` 로 정함. Jackson **default** 가 정확히 이 정책과 어디서 일치/불일치하는지, 어떤 feature 플래그로 보강 가능한지를 확정.
|
|
|
|
## 출처 / Source
|
|
|
|
- 원본 URL: https://fasterxml.github.io/jackson-databind/javadoc/2.13/com/fasterxml/jackson/databind/DeserializationFeature.html
|
|
- 아카이브 URL: (미수집)
|
|
- 저자 / 조직: FasterXML (Tatu Saloranta 외)
|
|
- 발행일: 2.13 Javadoc (이후 버전 동일 의미)
|
|
- 마지막 확인일: 2026-05-27
|
|
|
|
## 핵심 인용 / Key quotes (verbatim)
|
|
|
|
> [§FAIL_ON_UNKNOWN_PROPERTIES] "Feature that determines whether encountering of unknown properties (ones that do not map to a property, and there is no 'any setter' or handler that can handle it) should result in a failure (by throwing a JsonMappingException) or not." — **Default: Enabled** (exception thrown for unknown properties).
|
|
|
|
> [§FAIL_ON_NULL_FOR_PRIMITIVES] "Feature that determines whether encountering of JSON null is an error when deserializing into Java primitive types (like 'int' or 'double')." — **Default: Disabled** (null values use default primitives like 0 or 0.0).
|
|
|
|
> [§FAIL_ON_IGNORED_PROPERTIES] "Feature that determines what happens when a property that has been explicitly marked as ignorable is encountered in input: if feature is enabled, JsonMappingException is thrown; if false, property is quietly skipped." — **Default: Disabled** (no exception thrown).
|
|
|
|
> [§READ_UNKNOWN_ENUM_VALUES_AS_NULL] "Feature that allows unknown Enum values to be parsed as null values. If disabled, unknown Enum values will throw exceptions." — **Default: Disabled** (exceptions thrown for unknown enum values).
|
|
|
|
## Claims Extracted / 추출된 주장
|
|
|
|
| Claim ID | Claim (이 자료가 직접 말하는 것) | Evidence quote | Strength | Applies to | Does not prove |
|
|
|---|---|---|---|---|---|
|
|
| SJUF-C1 | `FAIL_ON_UNKNOWN_PROPERTIES` 의 Jackson 2.13 default 는 **enabled** — unknown property 발견 시 `JsonMappingException` 발생 | [§FAIL_ON_UNKNOWN_PROPERTIES] "...should result in a failure (by throwing a JsonMappingException) or not." Default: Enabled | `official-vendor-doc` | Jackson databind 2.13+ default 동작 | Spring Boot 의 `JacksonProperties` / `@JsonIgnoreProperties` 가 이 default 를 override 하지 않는다는 뜻 아님 |
|
|
| SJUF-C2 | `FAIL_ON_NULL_FOR_PRIMITIVES` 의 default 는 **disabled** — JSON null 이 Java primitive 로 deserialize 될 때 silently 0 / 0.0 / false 로 변환됨 | [§FAIL_ON_NULL_FOR_PRIMITIVES] "...JSON null is an error when deserializing into Java primitive types..." Default: Disabled | `official-vendor-doc` | Jackson 의 null → primitive 변환 default | wrapper type (Integer / Double) 사용 시 동일한 silent 변환이 일어난다는 뜻 아님 (wrapper 는 null 자체 보존) |
|
|
| SJUF-C3 | `FAIL_ON_IGNORED_PROPERTIES` 의 default 는 **disabled** — `@JsonIgnore` 로 표시된 property 가 input 에 등장해도 조용히 skip | [§FAIL_ON_IGNORED_PROPERTIES] "...if feature is enabled, JsonMappingException is thrown; if false, property is quietly skipped." Default: Disabled | `official-vendor-doc` | Jackson 의 ignored property 처리 default | `@JsonIgnoreProperties(ignoreUnknown=true)` 와는 별개 feature — 이름 유사하나 작동 영역 다름 |
|
|
| SJUF-C4 | `READ_UNKNOWN_ENUM_VALUES_AS_NULL` 의 default 는 **disabled** — 알 수 없는 enum value 는 예외 발생 | [§READ_UNKNOWN_ENUM_VALUES_AS_NULL] "...If disabled, unknown Enum values will throw exceptions." Default: Disabled | `official-vendor-doc` | Jackson enum deserialization default | `READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE` 등 별도 feature 의 동작은 본 인용 범위 밖 |
|
|
|
|
## Usage Boundaries / 적용 경계
|
|
|
|
- **이 자료가 직접 증명하는 것**:
|
|
- `SJUF-C1` ~ `C4`: Jackson 2.13 의 4가지 DeserializationFeature default 값과 정확한 작동 설명
|
|
- **이 자료가 증명하지 않는 것**:
|
|
- Spring Boot 의 auto-configuration 이 위 default 를 어떻게 override 하는지 (`spring.jackson.deserialization.*` 키 별도 확인 필요)
|
|
- `@JsonIgnoreProperties(ignoreUnknown=true)` 가 class 단위로 `FAIL_ON_UNKNOWN_PROPERTIES` 를 우회하는 정확한 메커니즘 (annotation 처리 우선순위)
|
|
- 응답 serialization 시 schema 강제 (OpenAPI drift 검출) — Jackson 만으로는 부족, 별도 도구 필요
|
|
- Jackson 의 더 신버전 (2.14+ / 3.x) 에서 default 가 동일하게 유지되는지
|
|
- **내 프로젝트에 적용하려면 추가 확인이 필요한 것**:
|
|
- ca-tmpl 의 ObjectMapper 빈 설정 (Spring Boot starter 의 `Jackson2ObjectMapperBuilder` customizer)
|
|
- `FAIL_ON_NULL_FOR_PRIMITIVES=true` 토글 시 기존 DTO 가 primitive vs wrapper 어느 쪽인지의 코드 스캔
|
|
- ArchUnit 등으로 `@JsonIgnoreProperties(ignoreUnknown=true)` 의 무분별한 사용을 금지하는 rule 설정 가능성
|
|
|
|
## 메모 / Notes (내 프로젝트 해석)
|
|
|
|
> 본 섹션은 자료 직접 인용 아님. ca-tmpl 결정 컨텍스트 해석.
|
|
|
|
- **ca-tmpl 정합/불일치**:
|
|
|
|
| ca-tmpl 결정 | Jackson default | 정합 |
|
|
|---|---|---|
|
|
| request unknown field → fail | `FAIL_ON_UNKNOWN_PROPERTIES=true` (default) | 일치 |
|
|
| response schema 없는 field 노출 금지 | Jackson 은 직렬화 자동 — schema 강제는 OpenAPI 영역 | **Jackson 만으론 부족**. OpenAPI drift 검증 필요 |
|
|
| null/empty/missing 의미 분리 | `FAIL_ON_NULL_FOR_PRIMITIVES=false` default → null → 0 silently | **불일치**: ca-tmpl 이 명시적으로 분리 요구. → `FAIL_ON_NULL_FOR_PRIMITIVES=true` 또는 wrapper (Integer) 사용 강제 |
|
|
| enum unknown → validation failure | `READ_UNKNOWN_ENUM_VALUES_AS_NULL=false` (default) — exception | 일치 |
|
|
|
|
- 실제 함정:
|
|
- Spring Boot 의 `JacksonProperties` 는 일부 default 를 override 할 수 있음. `spring.jackson.deserialization.fail-on-unknown-properties` 명시 권장.
|
|
- `@JsonIgnoreProperties(ignoreUnknown=true)` 가 클래스에 붙어 있으면 ca-tmpl 정책을 우회. 정적 분석 / `ArchUnit` 으로 금지하는 것이 좋음.
|
|
- Trade-off:
|
|
- Jackson default (lenient: ignoreUnknown=true) 를 쓰면 client integration 이 쉬움. 다만 silent drift 가 누적.
|
|
- Jackson strict (default) 는 ca-tmpl 과 정합. client 변경 시 즉시 깨짐 → CI 에서 잡힘.
|
|
|
|
## Related / 관련
|
|
|
|
- 같은 주제 다른 official-doc:
|
|
- [[raw/official-docs/schema-bigdecimal-money-serialization-java]] (Jackson + BigDecimal)
|
|
- [[raw/official-docs/schema-avro-evolution-rules]] (Avro 의 자동 unknown-ignore 와 대조)
|
|
- [[raw/official-docs/schema-protobuf-vs-json-evolution]] (Protobuf 의 unknown 자동 보존과 대조)
|
|
- 인용하는 branch:
|
|
- [[raw/branch-notes/feature-schema-serialization-contract]] (G-F 대안 1)
|
|
- 인용하는 wiki: (미작성)
|