[ 
https://issues.apache.org/jira/browse/JOHNZON-416?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17951343#comment-17951343
 ] 

Romain Manni-Bucau commented on JOHNZON-416:
--------------------------------------------

while i think we should support it we start to fall in an undefined zone of the 
spec cause adapters do not define when to stop to support it. A trivial example 
of that is that a wildcard type must not be supported by design (wouldnt be 
symmetric). The opposite is Class are supported (current johnzon impl). All in 
the middle is in grey zone so can be worth a spec clarification IMHO.

> Read/write fail with Map JsonbTypeAdapter on deserialized class
> ---------------------------------------------------------------
>
>                 Key: JOHNZON-416
>                 URL: https://issues.apache.org/jira/browse/JOHNZON-416
>             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 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.



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

Reply via email to