spring-cloud / spring-cloud/spring-cloud-function

UPDATED: Type resolution with deep generic hierarchies still fail in 2025.1.1 (regression from issue #1312)

Open
#1,325 3 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
1.1k
Forks
641
Avg merge
11h 2m
Merged PRs (30d)
8

Description

Description

This is a follow-up to issue #1312 ("Type resolution with deep generic hierarchies is incorrect"). After upgrading Spring Cloud BOM from 2025.0.0 to 2025.1.1 and Spring Boot to 4.0.3, type resolution issues persist in batch mode consumption.

The demo repository (ferblaca/demoStreamGenerics/tree/upgrade_to_2025_0_0) was re-tested to confirm the behavior.

Current Behavior
Single Mode - All Consumers Work ✅
  • productConsumer (GenericConsumer<ProductCompleteDTO>)
  • productConsumer2 (Consumer<ProductCompleteDTO>)
  • productMessageConsumer (GenericMessageConsumer<ProductCompleteDTO>)
  • productMessageConsumer2 (Consumer<Message<ProductCompleteDTO>>)
Batch Mode - Partial Failure ⚠️
  • productBatchListConsumer (GenericBatchListConsumer<ProductCompleteDTO>): ❌ Fails — payload arrives as byte[........]
  • productBatchListConsumer2 (Consumer<List<ProductCompleteDTO>>): ✅ Works
  • productBatchListMessageConsumer (GenericBatchMessageListConsumer<ProductCompleteDTO>): ✅ Works
  • productBatchListMessageConsumer2 (Consumer<Message<List<ProductCompleteDTO>>>): ✅ Works
Root Cause

Only the productBatchListConsumer bean with the following signature fails to deserialize correctly:

@Bean
public GenericBatchListConsumer<ProductCompleteDTO> productBatchListConsumer() {
    return new GenericBatchListConsumer<>("productBatchListConsumer");
}

Where GenericBatchListConsumer is defined as:

public class GenericBatchListConsumer<T> implements Consumer<List<T>> {
    // ...
}

Instead of deserializing to the expected type, the message payload arrives as raw bytes:

Received Batch List productBatchListConsumer Consumer: [123, 34, 105, 100, 34, 58, 49, ...]
Steps to Reproduce
  1. Clone the demo repository
  2. Update pom.xml with:
    • Spring Cloud BOM: 2025.1.1
    • Spring Boot: 4.0.3
  3. Run ./mvnw spring-boot:run (Kafka starts automatically via Docker Compose)
  4. Send the same test messages from the original issue
  5. Check the logs for the byte array payload symptom
Environment
Component Version
Spring Boot 4.0.3
Spring Cloud Stream 5.0.1
Spring Cloud Function 5.0.1
Message Broker Kafka (KRaft mode via Docker Compose)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running the demo with ./mvnw spring-boot:run after checking the version changes in pom.xml, then follow the productBatchListConsumer bean and GenericBatchListConsumer signature described in the issue. Compare its batch payload with the working consumers; done means it deserializes to ProductCompleteDTO values instead of raw bytes while the existing single- and batch-mode consumers continue to work.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker-compose, java, kafka, spring, spring-boot
Domain
backend, distributed-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.