Skip to content

JDK 17: InaccessibleObjectException when deserialized class has java.time.Instant field #1996

Closed
@Or4ng3

Description

@Or4ng3

Hi.

I'm using gson 2.8.8 with jdk 17. This code:

import com.google.gson.Gson;
import org.junit.jupiter.api.Test;

import java.time.Instant;

class DTO {
	private Instant instant;
}

public class GsonTest {
	@Test
	public void test() {
		var gson = new Gson();
		var dto = gson.fromJson("{}", DTO.class);
	}
}

Fails with exception:

java.lang.reflect.InaccessibleObjectException: Unable to make field private final long java.time.Instant.seconds accessible: module java.base does not "opens java.time" to unnamed module @73035e27

	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.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible(UnsafeReflectionAccessor.java:44)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:159)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
	at com.google.gson.Gson.getAdapter(Gson.java:458)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
	at com.google.gson.Gson.getAdapter(Gson.java:458)
	at com.google.gson.Gson.fromJson(Gson.java:931)
	at com.google.gson.Gson.fromJson(Gson.java:897)
	at com.google.gson.Gson.fromJson(Gson.java:846)
	at com.google.gson.Gson.fromJson(Gson.java:817)
	at com.test.GsonTest.test(GsonTest.java:17)

Activity

Marcono1234

Marcono1234 commented on Oct 18, 2021

@Marcono1234
Collaborator

See #1979 (comment) or related issues. You are deserializing (maybe by accident) an internal field of a JDK class; you have to write a custom TypeAdapter or you could try third-party libraries such as https://github.com/gkopff/gson-javatime-serialisers adding support for java.time classes.

Or4ng3

Or4ng3 commented on Oct 18, 2021

@Or4ng3
Author

Yes, the problem with class java.time.Instant (it's the only field in example). Also I see same problem with LocalDate and LocalTime classes.
However, I think that java.time package should be supported since its classes are newer and better than java.util.Date

Marcono1234

Marcono1234 commented on Oct 18, 2021

@Marcono1234
Collaborator

However, I think that java.time package should be supported since its classes are newer and better than java.util.Date

See #1059

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @eamonnmcmanus@Or4ng3@Marcono1234

        Issue actions

          JDK 17: InaccessibleObjectException when deserialized class has java.time.Instant field · Issue #1996 · google/gson