GraalVM / SpringBoot3 / Maven / Jooq:在数据库保存时“无法构造新记录”

问题描述 投票:0回答:1

我正在尝试将一个小项目转移到本机构建。在 Win10 上,我可以毫无错误地构建一个 exe,应用程序正在启动,现在我可以使用 ctx.insertInto() 插入,但我有大量 ctx.newRecord() 错误“无法构建新记录”。

2024-05-26T23:43:31.700+02:00 ERROR 29568 --- [SmartScrumPokerBackendNativeApplication] [boundChannel-10] .WebSocketAnnotationMethodMessageHandler : Unhandled exception from message handler method

java.lang.IllegalStateException: Could not construct new record
        at org.jooq.impl.Tools.recordFactory(Tools.java:1538) ~[na:na]
        at org.jooq.impl.Tools.newRecord(Tools.java:1377) ~[na:na]
        at org.jooq.impl.DefaultDSLContext.newRecord(DefaultDSLContext.java:4844) ~[smart_scrum_poker_backend_native.exe:na]
        at org.kbalazs.smart_scrum_poker_backend_native.socket_domain.account_module.repositories.InsecureUserSessionsRepository.create(InsecureUserSessionsRepository.java:22) ~[smart_scrum_poker_backend_native.exe:na]
        at [email protected]/java.lang.reflect.Method.invoke(Method.java:580) ~[smart_scrum_poker_backend_native.exe:na]

这是在本机中无法运行的代码,但在 JVM 中运行良好:

InsecureUserRecord insecureUserRecord = getDSLContext().newRecord(insecureUserTable, insecureUser);
insecureUserRecord.store();

它可能与本机反射问题有关,也许我应该以某种方式在 ReflectionConfigurationFiles 中列出生成的文件,我正在尝试为此找到一个示例。

如果有一些提示或代码示例,我会非常高兴。 (感谢卢卡斯的快速回复!)

java jooq graalvm spring-boot-3 spring-native
1个回答
0
投票

RegisterReflectionForBinding
是反射问题的解决方案。它可以是基于类的,也可以是 JSON 文件格式。我认为通过构建时使用文件夹列表生成 JSON 很容易。

基于类的解决方案:

package org.kbalazs.smart_scrum_poker_backend_native.config;

import org.kbalazs.smart_scrum_poker_backend_native.db.tables.records.InsecureUserRecord;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.aot.hint.annotation.RegisterReflectionForBinding;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportRuntimeHints;

import static org.springframework.aot.hint.MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS;
import static org.springframework.aot.hint.MemberCategory.INVOKE_PUBLIC_METHODS;
import static org.springframework.aot.hint.MemberCategory.PUBLIC_FIELDS;

@Configuration
@RegisterReflectionForBinding({
    InsecureUserRecord.class,
})
@ImportRuntimeHints(ReflectionConfiguration.AppRuntimeHintsRegistrar.class)
public class ReflectionConfiguration
{
    public static class AppRuntimeHintsRegistrar implements RuntimeHintsRegistrar
    {
        @Override
        public void registerHints(RuntimeHints hints, ClassLoader classLoader)
        {
            hints.reflection()
                .registerType(InsecureUserRecord.class, PUBLIC_FIELDS, INVOKE_PUBLIC_METHODS, INVOKE_PUBLIC_CONSTRUCTORS)
            ;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.