I have a simple maven project for generating a rest client with openapi-generator-maven-plugin from an open-api json file.
I'm using <library>okhttp-gson</library> and because I don't want to use OffsetDateTime I'm also using <dateLibrary>java8-localdatetime</dateLibrary>
To build the generated sources I'm using those dependencies
<properties>
<gson-version>2.10</gson-version>
<gson-fire-version>1.8.5</gson-fire-version>
<okhttp3-version>4.10.0</okhttp3-version>
<swagger-version>1.6.8</swagger-version>
</properties>
<dependencies>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger-version}</version>
</dependency>
<!-- @Nullable annotation -->
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
<!-- HTTP client : okhttp3 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>${okhttp3-version}</version>
</dependency>
<!-- JSON processing : gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10</version>
</dependency>
<dependency>
<groupId>io.gsonfire</groupId>
<artifactId>gson-fire</artifactId>
<version>${gson-fire-version}</version>
</dependency>
</dependencies>
Next to that I have a Spring Boot project for using the client.
<dependency>
<groupId>com.example</groupId>
<artifactId>demo-api-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
The problem is that when I'm using the client I have
java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.time.LocalDate java.time.LocalDateTime.date accessible: module java.base does not "opens java.time" to unnamed module @562ff1d6
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na]
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[na:na]
...
I read somewhere to add
@Configuration
public class GsonConfiguration {
@Bean
public GsonBuilderCustomizer typeAdapterRegistration() {
System.out.println("---typeAdapterRegistration");
return builder -> {
builder.registerTypeAdapter(LocalDateTimeDeserializer.class, new LocalDateTimeDeserializer());
};
}
}
and
public class LocalDateTimeDeserializer implements JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
System.out.println("---deserialize");
return LocalDateTime.parse(jsonElement.getAsString(), DateTimeFormatter.ISO_LOCAL_DATE);
}
}
But is not not working. typeAdapterRegistration is excuted but not deserialize.
How can I do ?
Most likely the following line is causing the issue:
Here you are registering the deserializer for type
LocalDateTimeDeserializer, but you don't want to deserialize aLocalDateTimeDeserializer, you want to deserialize aLocalDateTime, so it should be: