Search code examples
javaspringmongodbdockermicroservices

Fail: Spring Boot MongoDB ZonedDateTime converters for two databases


I am configuring Spring Boot with MongoDB using two database instances: primary and secondary: Spring Boot version is 2.7.6. The problem is that I have collection in the database with ZonedDateTime. In case when I have one database connection. it was fine, I just configured customConversions with Zone Date time converters. But now I have two MongoDB configuration files, one for primary and for secondary.

First config:

@Bean
@Primary
@Override
public MongoCustomConversions customConversions() {
    List<Converter<?, ?>> converters = new ArrayList<>();
    converters.add(new MultipleMongoConfig.DateToZonedDateTimeConverter());
    converters.add(new MultipleMongoConfig.ZonedDateTimeToDateConverter());
    return new MongoCustomConversions(converters);
}

@Bean
@Primary
public MongoDatabaseFactory primaryFactory() throws Exception {
    return new SimpleMongoClientDatabaseFactory(((connection)));
}

@Primary
@Bean(name = "primaryMongoTemplate")
public MongoTemplate primaryMongoTemplate() throws Exception {     
    return new MongoTemplate(primaryFactory());
}

Second:

@Bean(name = "secondaryMongoTemplate")
public MongoTemplate secondaryMongoTemplate() throws Exception {
    return new MongoTemplate(secondaryFactory());
}

@Bean    
@Override
public MongoCustomConversions customConversions() {
    List<Converter<?, ?>> converters = new ArrayList<>();
    converters.add(new MultipleMongoConfig.DateToZonedDateTimeConverter());
    converters.add(new MultipleMongoConfig.ZonedDateTimeToDateConverter());
    return new MongoCustomConversions(converters);
}

@Bean
public MongoDatabaseFactory secondaryFactory() throws Exception {
    return new SimpleMongoClientDatabaseFactory(((connection)));
}

Configuration in the yaml:

main:
    allow-bean-definition-overriding: true

But exception the same after save in db:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.time.ZonedDateTime.

I tried even one customConversion for two db connections, but result the same.

In the Maven Java config is 1.8, but application works under openjdk19 docker container.


Solution

  • I added "--add-opens", "java.base/java.time.zone=ALL-UNNAMED" in my docker file, because "--add-opens", "java.base/java.time=ALL-UNNAMED" would not help. My docker file finally:

    ENTRYPOINT ["java", "--add-opens", "java.base/java.time.zone=ALL-UNNAMED", "--add-opens", "java.base/java.time=ALL-UNNAMED", "--add-opens", "java.base/java.math=ALL-UNNAMED", "--add-opens", "java.base/java.lang=ALL-UNNAMED", \
                "--add-opens", "java.management/sun.management=ALL-UNNAMED", \
                "-XX:+UseZGC", "-XX:MinHeapSize=2G", "-XX:InitialHeapSize=2G", "-Xss1024k", \
                "-XX:ParallelGCThreads=100", "-XX:ConcGCThreads=25", "-XX:TieredStopAtLevel=1", \
                "-XX:NonProfiledCodeHeapSize=512m", "-XX:ReservedCodeCacheSize=1G", "-XX:InitialCodeCacheSize=512m", "-XX:CodeCacheExpansionSize=2m", \ 
                "-XX:SoftRefLRUPolicyMSPerMB=0","-XX:ZCollectionInterval=30", "-XX:ZFragmentationLimit=10", \
                "-XX:MaxGCPauseMillis=5", "-XX:+UseCompressedClassPointers", "-XX:-UseCompressedOops", "-XX:ZUncommitDelay=30", \
                "-XX:InitiatingHeapOccupancyPercent=35", "-XX:G1HeapRegionSize=16M", \
                "-XX:MinMetaspaceFreeRatio=50", "-XX:MaxMetaspaceFreeRatio=100",  \
                "-XX:+UnlockExperimentalVMOptions","-jar","/opt/myapp.jar"]