eclipse-ee4j / eclipse-ee4j/yasson

Yasson ignores @JsonbTypeAdapter on class level of object in Collection

Open
#652 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
Java
Stars
218
Forks
109
Avg merge
1d 5h
Merged PRs (30d)
9

Description

**Describe the bug**

According to the JSON-B Specification v3 chapter 4.7.1...
>There are two ways how to register JsonbAdapter:
>* Using JsonbConfig::withAdapters method;
>* Annotating a class field with JsonbTypeAdapter annotation.

Yasson 3.0.4 inconsistently handles adapters for objects in collections:
* Using `JsonbConfig::withAdapters`, Yasson *correctly* respects the adapter for an object in a collection.
* Using `@JsonbTypeAdapter` on the class, Yasson *incorrectly* ignores the adapter for an object in a collection but serializes the object's public fields instead.

**To Reproduce**
```java
public class YassonBug {

public static void main(String[] arguments) throws Exception {
var c = new C();

// Correctly applies @JsonbTypeAdapter in both cases
try (var jsonb = JsonbBuilder.newBuilder().build()) {
System.out.println(jsonb.toJson(c)); // correctly prints `"correct value"`
System.out.println(jsonb.toJson(Set.of(c))); // correctly prints `["correct value"]`
}

// Correctly applies config in both cases
var config = new JsonbConfig().withAdapters(new CAdapter());
try (var jsonb = JsonbBuilder.newBuilder().withConfig(config).build()) {
System.out.println(jsonb.toJson(Set.of(c))); // correctly prints `["correct value"]`
System.out.println(jsonb.toJson(c)); // correctly prints `"correct value"`
}

// Incorrectly applies @JsonbTypeAdapter in the `List.of(c)` case (and remembers wrong decision in the `c` case)
try (var jsonb = JsonbBuilder.newBuilder().build()) {
System.out.println(jsonb.toJson(Set.of(c))); // incorrectly prints `[{"wrong":"value"}]`, should be `["correct value"]`
System.out.println(jsonb.toJson(c)); // incorrectly prints `{"wrong":"value"}`, should be `"correct value"`
}
}

@JsonbTypeAdapter(CAdapter.class)
public static class C {
public String wrong = "value";
}

public static class CAdapter implements JsonbAdapter {

@Override
public String adaptToJson(C obj) throws Exception {
return "correct value";
}

@Override
public C adaptFromJson(String obj) throws Exception {
throw new UnsupportedOperationException("Unimplemented method 'adaptFromJson'");
}

}

}
```

**Expected behavior**

Yasson should correctly respect adapter for object in collection registered using `@JsonbTypeAdapter` just in the same ways it already correctly respects adapters set using `::withAdapters`.

**System information:**

- OS: Windows
- Java Version: 19
- Yasson Version: 3.0.4

**Additional context**

See also https://github.com/eclipse-ee4j/yasson/issues/603.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.