[ https://issues.apache.org/jira/browse/JOHNZON-417?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
David Blevins updated JOHNZON-417: ---------------------------------- Description: Attempting to serialize or deserialize class Email as follows {code:java} final Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); final String json = "\{\"user\":\"test\",\"domain\":\"domain.com\"}"; final Email email = jsonb.fromJson(json, Email.class);{code} and adapter code {code:java} public static class Config implements JsonbAdapter<Email, Map<String, Object>> { @Override public Map<String, Object> adaptToJson(final Email obj) { final LinkedHashMap<String, Object> map = new LinkedHashMap<>(); map.put("user", obj.user); map.put("domain", obj.domain); return map; } @Override public Email adaptFromJson(final Map<String, Object> map) { return new Email(map.get("user").toString(), map.get("domain").toString()); }{code} fails and the JsonbAdapter specified in the JsonbConfig will not be invoked {code:java} public static class Email { private final String user; private final String domain; public Email(final String user, final String domain) { //.. } //... {code} will fail with exception {code:java} jakarta.json.bind.JsonbException: Email has no suitable constructor or factory. Cannot deserialize json object value: {"user":"test","domain":"domain.com"} Use Johnzon @ConstructorProperties or @JsonbCreator if constructor arguments are needed class org.apache.johnzon.jsonb.symmetry.adapter.map.MapAdapterOnClassTest$Email not instantiable{code} if the {{Email}} class is annotated with {{@JsonbTypeAdapter}} the error will be as indicated in JOHNZON-416 This this will work for a write and the {{Adapter.Config}} specified in the configuration will be used. was: Attempting to serialize or deserialize class Email as follows {code:java} final String json = "\{\"user\":\"test\",\"domain\":\"domain.com\"}"; final Email email = jsonb.fromJson(json, Email.class);{code} fails if the adapter is declared on the Email class {code:java} @JsonbTypeAdapter(Adapter.EmailClass.class) public static class Email { final String user; final String domain; //... {code} and adapter code {code:java} public abstract static class Adapter implements JsonbAdapter<Email, Map<String, Object>> { @Override public Map<String, Object> adaptToJson(final Email obj) { final LinkedHashMap<String, Object> map = new LinkedHashMap<>(); map.put("user", obj.user); map.put("domain", obj.domain); return map; } @Override public Email adaptFromJson(final Map<String, Object> map) { return new Email(map.get("user").toString(), map.get("domain").toString()); } {code} Fails with the following exception {code:java} java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class at java.base/java.lang.Class.cast(Class.java:3889) at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) at org.apache.johnzon.jsonb.JsonbAccessMode.findAdapter(JsonbAccessMode.java:846) at org.apache.johnzon.mapper.access.KnownNotOpenedJavaTypesAccessMode.findAdapter(KnownNotOpenedJavaTypesAccessMode.java:259) at org.apache.johnzon.mapper.Mappings.createClassMapping(Mappings.java:532) at org.apache.johnzon.jsonb.JsonbMappings.createClassMapping(JsonbMappings.java:46) at org.apache.johnzon.mapper.Mappings.doFindOrCreateClassMapping(Mappings.java:455) at org.apache.johnzon.mapper.Mappings.findOrCreateClassMapping(Mappings.java:429) at org.apache.johnzon.mapper.MappingGeneratorImpl.doWriteObject(MappingGeneratorImpl.java:182) at org.apache.johnzon.mapper.Mapper.writeObject(Mapper.java:207) at org.apache.johnzon.mapper.Mapper.writeObjectWithGenerator(Mapper.java:192) at org.apache.johnzon.mapper.Mapper.writeObject(Mapper.java:186) at org.apache.johnzon.mapper.Mapper.writeObjectAsString(Mapper.java:224) at org.apache.johnzon.jsonb.JohnzonJsonb.toJson(JohnzonJsonb.java:271) at org.apache.johnzon.jsonb.symmetry.adapter.map.MapAdapterOnClassDirectTest.assertWrite(MapAdapterOnClassDirectTest.java:34) at org.apache.johnzon.jsonb.symmetry.SymmetryTest.write(SymmetryTest.java:39) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:231) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Suppressed: jakarta.json.stream.JsonGenerationException: Invalid json, state=INITIAL at org.apache.johnzon.core.JsonGeneratorImpl.close(JsonGeneratorImpl.java:447) at org.apache.johnzon.mapper.Mapper.writeObject(Mapper.java:181) ... 32 more {code} This will work on a read and write in any order if Email is a field inside another class. > Read fail with Map JsonbTypeAdapter specified via JsonbConfig > ------------------------------------------------------------- > > Key: JOHNZON-417 > URL: https://issues.apache.org/jira/browse/JOHNZON-417 > Project: Johnzon > Issue Type: Bug > Components: JSON-B > Affects Versions: 2.0.1 > Reporter: David Blevins > Priority: Major > > Attempting to serialize or deserialize class Email as follows > > {code:java} > final Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new > Adapter.Config())); > final String json = "\{\"user\":\"test\",\"domain\":\"domain.com\"}"; > final Email email = jsonb.fromJson(json, Email.class);{code} > and adapter code > {code:java} > public static class Config implements JsonbAdapter<Email, Map<String, > Object>> { > @Override > public Map<String, Object> adaptToJson(final Email obj) { > final LinkedHashMap<String, Object> map = new LinkedHashMap<>(); > map.put("user", obj.user); > map.put("domain", obj.domain); > return map; > } > @Override > public Email adaptFromJson(final Map<String, Object> map) { > return new Email(map.get("user").toString(), > map.get("domain").toString()); > }{code} > fails and the JsonbAdapter specified in the JsonbConfig will not be invoked > {code:java} > public static class Email { > private final String user; > private final String domain; > public Email(final String user, final String domain) { > //.. > } > //... {code} > will fail with exception > {code:java} > jakarta.json.bind.JsonbException: Email has no suitable constructor or > factory. Cannot deserialize json object value: > {"user":"test","domain":"domain.com"} > Use Johnzon @ConstructorProperties or @JsonbCreator if constructor arguments > are needed > class > org.apache.johnzon.jsonb.symmetry.adapter.map.MapAdapterOnClassTest$Email not > instantiable{code} > if the {{Email}} class is annotated with {{@JsonbTypeAdapter}} the error will > be as indicated in JOHNZON-416 > This this will work for a write and the {{Adapter.Config}} specified in the > configuration will be used. -- This message was sent by Atlassian Jira (v8.20.10#820010)