Skip to content
This repository was archived by the owner on Oct 23, 2024. It is now read-only.
This repository was archived by the owner on Oct 23, 2024. It is now read-only.

在jdk17里使用fastjson反序列化Exception时,会抛出下面的异常,IgnoreErrorGetter配置不生效 #4077

@hengyunabc

Description

@hengyunabc
java.lang.reflect.InaccessibleObjectException: Unable to make field private java.lang.Throwable java.lang.Throwable.cause accessible: module java.base does not "opens java.lang" to unnamed module @2dc96ada
        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 com.alibaba.fastjson.util.TypeUtils.setAccessible(TypeUtils.java:2510)
        at com.alibaba.fastjson.util.FieldInfo.<init>(FieldInfo.java:196)
        at com.alibaba.fastjson.util.FieldInfo.<init>(FieldInfo.java:115)
        at com.alibaba.fastjson.util.TypeUtils.computeGetters(TypeUtils.java:2093)
        at com.alibaba.fastjson.util.TypeUtils.buildBeanInfo(TypeUtils.java:1819)
        at com.alibaba.fastjson.util.TypeUtils.buildBeanInfo(TypeUtils.java:1759)
        at com.alibaba.fastjson.serializer.SerializeConfig.getObjectWriter(SerializeConfig.java:564)
        at com.alibaba.fastjson.serializer.SerializeConfig.getObjectWriter(SerializeConfig.java:440)
        at com.alibaba.fastjson.serializer.JSONSerializer.getObjectWriter(JSONSerializer.java:448)
        at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:309)
        at com.alibaba.fastjson.JSON.toJSONString(JSON.java:687)
        at com.alibaba.fastjson.JSON.toJSONString(JSON.java:676)

com.alibaba.fastjson.util.TypeUtils 里的 catch AccessControlException 感觉要改为 Throwable,因为在jdk 17里抛出的异常是 java.lang.reflect.InaccessibleObjectException

    static void setAccessible(AccessibleObject obj){
        if(!setAccessibleEnable){
            return;
        }
        if(obj.isAccessible()){
            return;
        }
        try{
            obj.setAccessible(true);
        } catch(AccessControlException error){
            setAccessibleEnable = false;
        }
    }

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions