David Blevins created JOHNZON-418:
-------------------------------------

             Summary: Inconsistent Precedence with JsonbTypeAdapter
                 Key: JOHNZON-418
                 URL: https://issues.apache.org/jira/browse/JOHNZON-418
             Project: Johnzon
          Issue Type: Bug
          Components: JSON-B
    Affects Versions: 2.0.1
            Reporter: David Blevins


In the scenario where there are competing {{JsonbTypeAdapter}} specified in 1) 
the {{JsonbConfig}} and 2) on the class itself, the behavior is not consistent 
in all scenarios.

We have an adapter specified on Email as follows and will attempt to override 
this via {{JsonbConfig}}
{code:java}
@JsonbTypeAdapter(Adapter.EmailClass.class)
public static class Email {
final String user;
final String domain; 
//... {code}
h2. Writing Email instance

When Email is written as a json document, the {{Adapter.Config}} specified via 
{{JsonbConfig}} will win. The {{Adapter.EmailClass}} on {{Email}} will lose.
{code:java}
final Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new 
Adapter.Config()));
final Email email = new Email("test", "domain.com");

final String json = jsonb.toJson(email);
assertEquals("\"t...@domain.com:Config.adaptToJson\"", json);
assertEquals("Config.adaptToJson", calls());{code}
This behavior is consistent with how {{JsonbTypeSerializer}} and 
{{JsonbTypeDeserializer}} are handled.
h2. Writing an Email field

When writing an object where Email is a field, the {{Adapter.EmailClass}} on 
{{Email}} will win. The {{Adapter.Config}} specified via {{JsonbConfig}} will 
lose.
{code:java}
final Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new 
Adapter.Config()));
final Email email = new Email("test", "domain.com");
final Contact contact = new Contact();
contact.setEmail(email);
reset();

final String json = jsonb.toJson(contact);
assertEquals("{\"email\":\"t...@domain.com:EmailClass.adaptToJson\"}", json);
assertEquals("Contact.getEmail\n" +
        "EmailClass.adaptToJson", calls());{code}
Where {{Email}} is a field or property of {{Contact}}
{code:java}
public static class Contact {

    private Email email;

    // normal non-annotated getter/setter ...
}
{code}
This behavior is inconsistent with the write behavior.
This behavior is inconsistent with read and write behavior of 
{{JsonbTypeSerializer}} and {{{}JsonbTypeDeserializer{}}}.

This behavior also makes it impossible to override behavior via configuration 
in any scenario.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to