Skip to content

It is not support for a generic record class #681

@yuan2006

Description

@yuan2006

Describe the bug
It throws exceptions when deserialize a record type from a json.
Result:

public record Result<T>(Integer code, String message, T data) {}

To Reproduce
Result:

public record Result<T>(Integer code, String message, T data) {}

deserialize demo:

        Result<User> result = jsonb.fromJson("""
                {
                    "code": 200,
                    "message": "no",
                    "data": null
                }
                """, new GenericType<Result<User>>() {
        });

exception:

jakarta.json.bind.JsonbException: Error resolving runtime type for type: T

	at org.eclipse.yasson.internal.ReflectionUtils.lambda$getRawType$0(ReflectionUtils.java:92)
	at java.base/java.util.Optional.orElseThrow(Optional.java:403)
	at org.eclipse.yasson.internal.ReflectionUtils.getRawType(ReflectionUtils.java:92)
	at org.eclipse.yasson.internal.deserializer.DeserializationModelCreator.createObjectDeserializer(DeserializationModelCreator.java:236)
	at org.eclipse.yasson.internal.deserializer.DeserializationModelCreator.deserializerChainInternal(DeserializationModelCreator.java:193)
	at org.eclipse.yasson.internal.deserializer.DeserializationModelCreator.deserializerChain(DeserializationModelCreator.java:135)
	at org.eclipse.yasson.internal.deserializer.DeserializationModelCreator.deserializerChain(DeserializationModelCreator.java:123)
	at org.eclipse.yasson.internal.DeserializationContextImpl.deserializeItem(DeserializationContextImpl.java:137)
	at org.eclipse.yasson.internal.DeserializationContextImpl.deserialize(DeserializationContextImpl.java:127)
	at org.eclipse.yasson.internal.JsonBinding.deserialize(JsonBinding.java:55)
	at org.eclipse.yasson.internal.JsonBinding.fromJson(JsonBinding.java:70)
	at test.dever.doc/test.cn.org.dever.doc.DataObjectCreatorTest.createInstance3(DataObjectCreatorTest.java:39)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

If I change Result from record to plain class.

    public class Result<T> {
        private Integer code;
        private String message;
        private T data;
        // getter/ setter
    }

it works, there is no exception in console.

Expected behavior

System information:

  • OS: Windows
  • Java Version: 21
  • Yasson Version: 3.0.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working right

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions