Support JSON binding with the JDK's built-in JSON API (`jdk.incubator.json`)
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 25/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- java, json
- Lĩnh vực
- api, backend-api-design
Hướng nghiên cứu
Read the linked proposal and inspect the prototype’s JsonRecordHttpMessageConverter to understand the proposed mapping and constraints. Compare the reflection, generated, hybrid, and tree-only options for spring-web and spring-messaging; done means the project has a decided scope and approach, or has explained why this belongs in a separate library.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Use case
I want to build Spring MVC REST endpoints that read and write Java records as JSON without a third-party JSON library:
@PostMapping("/hello")
public HelloResponse hello(@RequestBody HelloRequest request) { ... }
The same records should also work as Kafka message payloads:
@KafkaListener(topics = "hello")
public void onHello(HelloRequest request) { ... }
JDK 28 ships an incubating JSON API (jdk.incubator.json) that parses JSON into a JsonValue tree and writes it back, but it does not map JSON to Java types.
Spring has HTTP and messaging converters for Jackson, Gson, JSON-B and Kotlin Serialization, but none for the JDK API.
Reasons for a JDK-only option:
- Fewer dependencies for applications that only need simple JSON.
- A smaller attack surface:
jackson-databindhas 86 advisories in OSV, 17 of them published in 2026. - GraalVM native images without reflection metadata for the JSON library.
What I have tried so far
A prototype on Spring Boot 4.1 / JDK 28-ea: https://github.com/drnow4u/springboot-jdk28-json
JsonRecordHttpMessageConverter, anAbstractHttpMessageConverter<Record>that maps JSON objects to and from records using reflection over record components (String, numeric and boolean types, nested records).- Malformed JSON or a wrong value type is mapped to
HttpMessageNotReadableException(400). - The JDK parser has no size limits and repeats the offending input in its error messages, so the converter limits the body size (
413) and shortens error messages. - Spring AOT already registers reflection hints for the records used in the controller signature, so option A below may work in a native image; this cannot be verified until GraalVM supports JDK 28.
Questions
The main design question is how the mapping should work:
- A. Reflection over record components (what the prototype does). No setup, but needs AOT hints for native images.
- B. Compile-time generated bindings (annotation processor), similar to Kotlin Serialization. No reflection, errors at compile time, but needs a processor on the build path.
- C. Hybrid: generated bindings when present, reflection otherwise.
- D. Tree types only: a converter for
JsonValue/JsonObject/JsonArray, with mapping left to applications or libraries.
Whichever option is chosen, the mapping would be shared by an HttpMessageConverter (spring-web) and a MessageConverter (spring-messaging, used by @KafkaListener); a Kafka Serializer/Deserializer would belong in Spring for Apache Kafka.
Would the Spring team consider any of these for Spring Framework, and which one? Or should this live in a separate library until the JDK API leaves incubation?
The full proposal, covering security, performance, native image and open questions, is here:
https://github.com/drnow4u/springboot-jdk28-json/blob/main/docs/proposal-jdk-json-binding.md
- Ngôn ngữ chính
- Java
- Star
- 60.3k
- Fork
- 38.7k
- Merge trung bình
- 1 ngày 1 giờ
- Pull request đã merge (30 ngày)
- 33
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của spring-projects/spring-framework
-
status: waiting-for-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 87/100
spring-projects/spring-framework#37613 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
`YamlProcessor.getFlattenedMap` with `includeEmpty` returns a `null` key for an empty root mappingCó thể làm lại được @erfannvb đã nhận 14 ngày trước và không có pull request nào đang mở. Đang mởstatus: waiting-for-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
spring-projects/spring-framework#37522 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
`WebClient` with default codecs drops `ProblemDetail` extension membersCó thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mởstatus: waiting-for-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
spring-projects/spring-framework#37503 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
StandardApiVersionDeprecationHandler generates nonconforming Sunset HTTP datesCó thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mởstatus: waiting-for-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
spring-projects/spring-framework#37486 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
FastByteArrayOutputStream input stream rejects valid skip(long) argumentsCó thể làm lại được @hickey-ai đã nhận 17 ngày trước và không có pull request nào đang mở. Đang mởstatus: waiting-for-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
spring-projects/spring-framework#37471 · 6 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của spring-projects/spring-framework
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
a2aproject/a2a-java#1275 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
module/ftp Type/Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
ballerina-platform/ballerina-library#9476 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
anwilli5/coin-collection-android-US#515 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
status: waiting-for-triage type: bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
spring-projects/spring-integration#11654 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 Dưới một giờ Mức phù hợp với người mới 70/100
Vakore/ZappierGames#248 ·