fix(bootstrap): force EMF init + enable schema-gen on startup
CI / Build Native (push) Successful in 6m24s
CI / Build Native (push) Successful in 6m24s
El error 'Table USERS not found' en BootstrapAdmin.User.count() se daba
porque en Quarkus native-image, con database.generation=update, el
schema-gen NO corre en startup del container por defecto (corre solo en
dev mode). Resultado: en un H2 fresco, el primer SELECT COUNT(*) del
bootstrap pierde contra una DB sin tablas.
Dos cambios:
1. application.properties: agregar
quarkus.hibernate-orm.schema-management.run-on-startup=true
para forzar el schema-gen en startup en prod/native.
2. BootstrapAdmin:
- @Transactional + EntityManager (em) inyectados
- em.createNativeQuery('SELECT 1') al inicio de onStart() para
asegurar que el EMF esté listo y la session esté abierta antes
del count(). Belt-and-suspenders.
This commit is contained in:
@@ -4,6 +4,8 @@ import io.quarkus.runtime.StartupEvent;
|
||||
import jakarta.enterprise.context.ApplicationScoped;
|
||||
import jakarta.enterprise.event.Observes;
|
||||
import jakarta.inject.Inject;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.transaction.Transactional;
|
||||
import org.eclipse.microprofile.config.inject.ConfigProperty;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
@@ -29,17 +31,28 @@ public class BootstrapAdmin {
|
||||
@Inject
|
||||
AuthService authService;
|
||||
|
||||
@Inject
|
||||
EntityManager em;
|
||||
|
||||
@ConfigProperty(name = "app.bootstrap.admin.enabled", defaultValue = "true")
|
||||
boolean enabled;
|
||||
|
||||
@ConfigProperty(name = "app.bootstrap.admin.username", defaultValue = "admin")
|
||||
String username;
|
||||
|
||||
@Transactional
|
||||
void onStart(@Observes StartupEvent ev) {
|
||||
if (!enabled) {
|
||||
LOG.info("Bootstrap admin disabled (app.bootstrap.admin.enabled=false)");
|
||||
return;
|
||||
}
|
||||
// El @Transactional + el toque al EntityManager fuerzan la inicialización
|
||||
// del EntityManagerFactory (y por lo tanto la corrida del schema-gen)
|
||||
// ANTES de preguntar `User.count()`. Sin esto, en un H2 fresco el
|
||||
// SELECT count(*) FROM users se ejecuta antes de que Hibernate haya
|
||||
// generado la tabla y falla con "Table USERS not found".
|
||||
em.createNativeQuery("SELECT 1").getSingleResult();
|
||||
|
||||
long count = User.count();
|
||||
if (count > 0) {
|
||||
LOG.infof("Bootstrap admin skipped: %d users already exist", count);
|
||||
@@ -54,7 +67,6 @@ public class BootstrapAdmin {
|
||||
+ "BOOTSTRAP-ADMIN-CHANGE This password MUST be changed on first login via POST /api/auth/change-password\n";
|
||||
|
||||
LOG.warn(banner);
|
||||
// Backup a stdout por si algún pipeline colecta stdout pero no el logger JBoss.
|
||||
System.out.print(banner);
|
||||
System.out.flush();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user