Skip to content

Micronaut Serialization requires java.sql module. #1085

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
NotJustAnna opened this issue Apr 17, 2025 · 0 comments
Open

Micronaut Serialization requires java.sql module. #1085

NotJustAnna opened this issue Apr 17, 2025 · 0 comments
Labels

Comments

@NotJustAnna
Copy link

Expected Behavior

I use jpackage to create a minimal java for my desktop application.
My desktop application does not use any type of SQL, only JSON.
I expected not to include java.sql module into my application's jpackage.

Actual Behaviour

As it turns out, java.sql is a required module.

 __  __ _                                  _
|  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| |  | | | (__| | | (_) | | | | (_| | |_| | |_
|_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
11:03:17.161 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Error instantiating bean of type  [io.micronaut.serde.jackson.JacksonJsonMapper]

Message: java/sql/Date
Path Taken:
new @j.i.Singleton i.m.h.n.b.NettyJsonHandler<j.l.Object>(JsonMapper jsonMapper)
\---> new @j.i.Singleton i.m.h.n.b.NettyJsonHandler<j.l.Object>([JsonMapper jsonMapper])
      \---> new @i.m.c.a.Primary @j.i.Singleton i.m.s.j.JacksonJsonMapper([SerdeRegistry registry], SerdeConfiguration serdeConfiguration, SerdeJacksonConfiguration jacksonConfiguration)
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type  [io.micronaut.serde.jackson.JacksonJsonMapper]

Message: java/sql/Date
Path Taken:
new @j.i.Singleton i.m.h.n.b.NettyJsonHandler<j.l.Object>(JsonMapper jsonMapper)
\---> new @j.i.Singleton i.m.h.n.b.NettyJsonHandler<j.l.Object>([JsonMapper jsonMapper])
      \---> new @i.m.c.a.Primary @j.i.Singleton i.m.s.j.JacksonJsonMapper([SerdeRegistry registry], SerdeConfiguration serdeConfiguration, SerdeJacksonConfiguration jacksonConfiguration)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2350)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3146)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2996)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2758)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1779)
        at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:210)
        at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2122)
        at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1352)
        at io.micronaut.serde.jackson.$JacksonJsonMapper$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2335)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3146)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2996)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2758)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1779)
        at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:210)
        at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2122)
        at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1352)
        at io.micronaut.http.netty.body.$NettyJsonHandler$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2335)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3146)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2996)
        at io.micronaut.context.DefaultBeanContext.addCandidateToList(DefaultBeanContext.java:3605)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistrations(DefaultBeanContext.java:3560)
        at io.micronaut.context.DefaultBeanContext.getBeanRegistrations(DefaultBeanContext.java:3534)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:1473)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:896)
        at io.micronaut.http.body.DefaultMessageBodyHandlerRegistry.findWriterImpl(DefaultMessageBodyHandlerRegistry.java:109)
        at io.micronaut.http.body.AbstractMessageBodyHandlerRegistry.findWriter(AbstractMessageBodyHandlerRegistry.java:85)
        at io.micronaut.http.body.DefaultMessageBodyHandlerRegistry.findWriter(DefaultMessageBodyHandlerRegistry.java:47)
        at io.micronaut.web.router.DefaultRouteInfo.<init>(DefaultRouteInfo.java:97)
        at io.micronaut.web.router.DefaultMethodBasedRouteInfo.<init>(DefaultMethodBasedRouteInfo.java:75)
        at io.micronaut.web.router.DefaultRequestMatcher.<init>(DefaultRequestMatcher.java:51)
        at io.micronaut.web.router.DefaultUrlRouteInfo.<init>(DefaultUrlRouteInfo.java:76)
        at io.micronaut.web.router.DefaultRouteBuilder$DefaultUriRoute.toRouteInfo(DefaultRouteBuilder.java:872)
        at io.micronaut.web.router.DefaultRouter.<init>(DefaultRouter.java:111)
        at io.micronaut.web.router.$DefaultRouter$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2335)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3146)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2996)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2758)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1779)
        at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:210)
        at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2122)
        at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1352)
        at io.micronaut.http.server.$RouteExecutor$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2335)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3146)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2996)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2758)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1779)
        at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:210)
        at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2122)
        at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1352)
        at io.micronaut.http.server.netty.$DefaultNettyEmbeddedServerFactory$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2335)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3146)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2996)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2758)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1779)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1761)
        at io.micronaut.http.server.netty.$DefaultNettyEmbeddedServerFactory$BuildDefaultServer0$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2335)
        at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3146)
        at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2996)
        at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2758)
        at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:1842)
        at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:1817)
        at io.micronaut.context.DefaultBeanContext.findBean(DefaultBeanContext.java:871)
        at io.micronaut.context.BeanLocator.findBean(BeanLocator.java:410)
        at io.micronaut.runtime.Micronaut.start(Micronaut.java:77)
        at net.notjustanna.Application.main(Application.java:14)
Caused by: java.lang.NoClassDefFoundError: java/sql/Date
        at io.micronaut.serde.support.serdes.SqlDateSerde.getType(SqlDateSerde.java:107)
        at io.micronaut.serde.support.SerdeRegistrar.getTypes(SerdeRegistrar.java:43)
        at io.micronaut.serde.support.DefaultSerdeRegistry.lambda$registerBuiltInSerdes$0(DefaultSerdeRegistry.java:414)
        at io.micronaut.serde.support.serdes.Serdes.register(Serdes.java:119)
        at io.micronaut.serde.support.DefaultSerdeRegistry.registerBuiltInSerdes(DefaultSerdeRegistry.java:413)
        at io.micronaut.serde.support.DefaultSerdeRegistry.<init>(DefaultSerdeRegistry.java:314)
        at io.micronaut.serde.support.$DefaultSerdeRegistry$Definition.instantiate(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2335)
        ... 77 common frames omitted
Caused by: java.lang.ClassNotFoundException: java.sql.Date
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
        ... 85 common frames omitted

I tracked this to these two lines loading java.sql packages.

micronaut-serde-support-2.14.0-sources.jar!/io/micronaut/serde/support/serdes/Serdes.java:119

        consumer.accept(new SqlDateSerde(localDateSerde));
        consumer.accept(new SqlTimestampSerde(instantSerde));

I expected behavior similar to Jackson-Databind, which successfully loads without java.sql module.

jackson-databind-2.18.3-sources.jar!/com/fasterxml/jackson/databind/ext/OptionalHandlerFactory.java:86

    // classes from java.sql module, this module may or may not be present at runtime
    // (is included on Java 8, but not part of JDK core for Java 9 and beyond)
    private final Map<String, String> _sqlDeserializers;
    private final Map<String, Object> _sqlSerializers;

Steps To Reproduce

https://github.com/NotJustAnna/micronaut-serde-requires-sql provides a way to reproduce the error.

  • gradle jpackage
  • Go to build/jpackage/out
  • Run the generated executable

Environment Information

Operating System: Windows 11
JVM version: 21
(I understand this problem will happen with any OS + any JVM version as long as java.sql module is not there.)

Example Application

https://github.com/NotJustAnna/micronaut-serde-requires-sql

Version

4.8.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants