yasson icon indicating copy to clipboard operation
yasson copied to clipboard

Fails to serialize generic class annotated with @JsonbTypeSerializer

Open mkarg opened this issue 3 years ago • 4 comments

Yasson 1.0.9 and 2.0.2 both fail running the following code, but succeed once @JsonbTypeSerializer annotation is removed:

public class Yasson {
    public static void main(String[] args) {
        System.out.println(JsonbBuilder.create().toJson(new MyClass<String>()));
    }

    @JsonbTypeSerializer(MySerializer.class)
    public static class MyClass<T> {
    }

    public static class MySerializer<T> implements JsonbSerializer<MyClass<T>> {

        @Override
        public void serialize(MyClass<T> o, JsonGenerator generator, SerializationContext context) {
            context.serialize(new Object(), generator);
        }
    }

}

Stack trace:

Exception in thread "main" jakarta.json.bind.JsonbException: Internal error: Generic bound not found for type T declared in class java.lang.Class.
	at org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:79)
	at org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:101)
	at org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:126)
	at _SANDBOX.Yasson.main(Yasson.java:11)
Caused by: java.lang.IllegalStateException: Generic bound not found for type T declared in class java.lang.Class.
	at org.eclipse.yasson.internal.ReflectionUtils.resolveTypeArguments(ReflectionUtils.java:220)
	at org.eclipse.yasson.internal.ComponentMatcher.resolveTypeArg(ComponentMatcher.java:351)
	at org.eclipse.yasson.internal.ComponentMatcher.introspectSerializerBinding(ComponentMatcher.java:337)
	at org.eclipse.yasson.internal.AnnotationIntrospector.getSerializerBinding(AnnotationIntrospector.java:319)
	at org.eclipse.yasson.internal.AnnotationIntrospector.introspectCustomization(AnnotationIntrospector.java:737)
	at org.eclipse.yasson.internal.MappingContext.lambda$createParseClassModelFunction$1(MappingContext.java:91)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
	at org.eclipse.yasson.internal.MappingContext.getOrCreateClassModel(MappingContext.java:81)
	at org.eclipse.yasson.internal.Marshaller.getRootSerializer(Marshaller.java:161)
	at org.eclipse.yasson.internal.Marshaller.serializeRoot(Marshaller.java:142)
	at org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:73)
	... 3 more

mkarg avatar Oct 13 '21 07:10 mkarg