Use LocalDateTime wirh Spring Boot and Gson

510 Views Asked by At

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 ?

1

There are 1 best solutions below

0
Marcono1234 On

Most likely the following line is causing the issue:

builder.registerTypeAdapter(LocalDateTimeDeserializer.class, new LocalDateTimeDeserializer())

Here you are registering the deserializer for type LocalDateTimeDeserializer, but you don't want to deserialize a LocalDateTimeDeserializer, you want to deserialize a LocalDateTime, so it should be:

builder.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeDeserializer())