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

Christoph Dreis edited comment on JOHNZON-347 at 6/6/21, 4:16 PM:
------------------------------------------------------------------

Hi, [~romain.manni-bucau] , thanks for your quick response.

after checking your proposal and checking the results I see some more failures 
when writing primitives and Maps (that extend/implement Map and are not in the 
*java.* package). I adjusted the title of this issue. It would probably be 
better to just check the complete build for JDK 17 issues.

A naive patch like the following fixes more issues, but unfortunately not all:
{code:java}
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -423,8 +423,11 @@ public class Mappings {
             if (!Class.class.isInstance(clazz)) {
                 return null;
             }
+            if (isPrimitive(clazz)) {
+                return null;
+            }
             final Class asClass = Class.class.cast(clazz);
-            if (Map.class.isAssignableFrom(asClass) || asClass.isInterface()) {
+            if (Map.class.isAssignableFrom(asClass) || 
List.class.isAssignableFrom(asClass) || asClass.isInterface()) {
                 final Class<?> mapping = 
config.getInterfaceImplementationMapping().get(clazz);
                 if (mapping != null) {
                     classMapping = createClassMapping(mapping, args);
{code}


was (Author: christoph.dreis):
Hi, [~romain.manni-bucau] , thanks for your quick response.

after checking your proposal and checking the results I see some more failures 
when writing booleans and Maps (that extend/implement Map and are not in the 
*java.* package). I adjusted the title of this issue. It would probably be 
better to just check the complete build for JDK 17 issues.

A naive patch like the following fixes more issues, but unfortunately not all:
{code:java}

--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -423,8 +423,11 @@ public class Mappings {
             if (!Class.class.isInstance(clazz)) {
                 return null;
             }
+            if (isPrimitive(clazz)) {
+                return null;
+            }
             final Class asClass = Class.class.cast(clazz);
-            if (Map.class.isAssignableFrom(asClass) || asClass.isInterface()) {
+            if (Map.class.isAssignableFrom(asClass) || 
List.class.isAssignableFrom(asClass) || asClass.isInterface()) {
                 final Class<?> mapping = 
config.getInterfaceImplementationMapping().get(clazz);
                 if (mapping != null) {
                     classMapping = createClassMapping(mapping, args);
{code}

> Mapper.write(Array|Object)() fails on JDK 17
> --------------------------------------------
>
>                 Key: JOHNZON-347
>                 URL: https://issues.apache.org/jira/browse/JOHNZON-347
>             Project: Johnzon
>          Issue Type: Bug
>          Components: Mapper
>    Affects Versions: 1.2.13
>            Reporter: Christoph Dreis
>            Priority: Critical
>
> Hi,
> I've noticed that Mapper.writeArray fails on JDK 17 due to 
> [https://openjdk.java.net/jeps/403] strongly encapsulating internals now. To 
> reproduce just run `JohnzonJsonbTest` with JDK 17 (build 25 at least to 
> include JEP 403). You will see stacktraces like the following:
> ```
> java.lang.reflect.InaccessibleObjectException: Unable to make field private 
> final java.lang.Object[] java.util.Arrays$ArrayList.a accessible: module 
> java.base does not "opens java.util" to unnamed module 
> @4361bd48java.lang.reflect.InaccessibleObjectException: Unable to make field 
> private final java.lang.Object[] java.util.Arrays$ArrayList.a accessible: 
> module java.base does not "opens java.util" to unnamed module @4361bd48
>  at 
> java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
>  at 
> java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
>  at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) 
> at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) at 
> org.apache.johnzon.mapper.access.FieldAccessMode$FieldDecoratedType.<init>(FieldAccessMode.java:105)
>  at 
> org.apache.johnzon.mapper.access.FieldAccessMode$FieldReader.<init>(FieldAccessMode.java:169)
>  at 
> org.apache.johnzon.mapper.access.FieldAccessMode.doFindReaders(FieldAccessMode.java:49)
>  at 
> org.apache.johnzon.mapper.access.BaseAccessMode.findReaders(BaseAccessMode.java:82)
>  at 
> org.apache.johnzon.mapper.access.FieldAndMethodAccessMode.doFindReaders(FieldAndMethodAccessMode.java:68)
>  at 
> org.apache.johnzon.mapper.access.BaseAccessMode.findReaders(BaseAccessMode.java:82)
>  at 
> org.apache.johnzon.jsonb.JsonbAccessMode.findReaders(JsonbAccessMode.java:468)
>  at 
> org.apache.johnzon.mapper.access.KnownNotOpenedJavaTypesAccessMode.findReaders(KnownNotOpenedJavaTypesAccessMode.java:182)
>  at org.apache.johnzon.mapper.Mappings.createClassMapping(Mappings.java:475) 
> at 
> org.apache.johnzon.mapper.Mappings.doFindOrCreateClassMapping(Mappings.java:437)
>  at 
> org.apache.johnzon.mapper.Mappings.findOrCreateClassMapping(Mappings.java:411)
>  at org.apache.johnzon.mapper.Mapper.isDeduplicateObjects(Mapper.java:202) at 
> org.apache.johnzon.mapper.Mapper.writeObjectWithGenerator(Mapper.java:196) at 
> org.apache.johnzon.mapper.Mapper.writeObject(Mapper.java:189) at 
> org.apache.johnzon.mapper.Mapper.writeObject(Mapper.java:217) at 
> org.apache.johnzon.mapper.Mapper.writeArray(Mapper.java:104) at 
> org.apache.johnzon.jsonb.JohnzonJsonb.toJson(JohnzonJsonb.java:390)
> ```
> I didn't find a quick way to fix this, but let me know if I can help.
>  
> Cheers,
> Christoph



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to