From cc09fe894324c6f67bcfecdc5366120e42783780 Mon Sep 17 00:00:00 2001 From: Daniel Arroyo Date: Sat, 15 Aug 2026 01:10:47 -0400 Subject: [PATCH] fix(dtos): annotate records with @RegisterForReflection for native Jackson MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Las clases record NO se serializan bien en Quarkus 3.20.1 native-image aunque Jackson 2.17+ las soporta en JVM. GraalVM strip-ea la metadata del bytecode mas los accessors auto-generados, y Jackson no puede detectar que la clase es un record -> cae al BeanSerializer clasico -> 'no properties discovered to create BeanSerializer'. @RegisterForReflection le indica a Quarkus: incluƭ esta clase en la metadata de reflexion del native-image, asi Jackson la ve completa. Aplicado a los 16 DTOs (records + nested records): - auth: AuthMeResponse, AdminUserSummary, Credentials, ChangePasswordRequest, AdminResetPasswordRequest, ErrorBody, MustChangeBody - history: RunSummary, RunDetails, RunItem, RunSnapshot, RunIn, HistoryStats - state: AppState + Insumos + FormulaDto (nested) --- .../java/com/l2/shots/auth/AdminResetPasswordRequest.java | 3 +++ src/main/java/com/l2/shots/auth/AdminUserSummary.java | 3 +++ src/main/java/com/l2/shots/auth/AuthMeResponse.java | 3 +++ src/main/java/com/l2/shots/auth/AuthResource.java | 1 + src/main/java/com/l2/shots/auth/ChangePasswordRequest.java | 3 +++ src/main/java/com/l2/shots/auth/Credentials.java | 3 +++ .../java/com/l2/shots/auth/MustChangePasswordFilter.java | 2 ++ src/main/java/com/l2/shots/history/HistoryStats.java | 3 +++ src/main/java/com/l2/shots/history/RunDetails.java | 3 +++ src/main/java/com/l2/shots/history/RunIn.java | 3 +++ src/main/java/com/l2/shots/history/RunItem.java | 3 +++ src/main/java/com/l2/shots/history/RunSnapshot.java | 3 +++ src/main/java/com/l2/shots/history/RunSummary.java | 3 +++ src/main/java/com/l2/shots/state/AppState.java | 5 +++++ 14 files changed, 41 insertions(+) diff --git a/src/main/java/com/l2/shots/auth/AdminResetPasswordRequest.java b/src/main/java/com/l2/shots/auth/AdminResetPasswordRequest.java index bcb1f32..8d88536 100644 --- a/src/main/java/com/l2/shots/auth/AdminResetPasswordRequest.java +++ b/src/main/java/com/l2/shots/auth/AdminResetPasswordRequest.java @@ -1,4 +1,7 @@ package com.l2.shots.auth; +import io.quarkus.runtime.annotations.RegisterForReflection; + +@RegisterForReflection public record AdminResetPasswordRequest(String username, String newPassword) { } diff --git a/src/main/java/com/l2/shots/auth/AdminUserSummary.java b/src/main/java/com/l2/shots/auth/AdminUserSummary.java index 587a311..a59c0fc 100644 --- a/src/main/java/com/l2/shots/auth/AdminUserSummary.java +++ b/src/main/java/com/l2/shots/auth/AdminUserSummary.java @@ -1,8 +1,11 @@ package com.l2.shots.auth; +import io.quarkus.runtime.annotations.RegisterForReflection; + import java.time.Instant; import java.util.UUID; +@RegisterForReflection public record AdminUserSummary( UUID id, String username, diff --git a/src/main/java/com/l2/shots/auth/AuthMeResponse.java b/src/main/java/com/l2/shots/auth/AuthMeResponse.java index 40184a1..9170df4 100644 --- a/src/main/java/com/l2/shots/auth/AuthMeResponse.java +++ b/src/main/java/com/l2/shots/auth/AuthMeResponse.java @@ -1,8 +1,11 @@ package com.l2.shots.auth; +import io.quarkus.runtime.annotations.RegisterForReflection; + import java.time.Instant; import java.util.UUID; +@RegisterForReflection public record AuthMeResponse( UUID id, String username, diff --git a/src/main/java/com/l2/shots/auth/AuthResource.java b/src/main/java/com/l2/shots/auth/AuthResource.java index e41585f..512b814 100644 --- a/src/main/java/com/l2/shots/auth/AuthResource.java +++ b/src/main/java/com/l2/shots/auth/AuthResource.java @@ -180,6 +180,7 @@ public class AuthResource { .build(); } + @io.quarkus.runtime.annotations.RegisterForReflection public record ErrorBody(String error) { } } diff --git a/src/main/java/com/l2/shots/auth/ChangePasswordRequest.java b/src/main/java/com/l2/shots/auth/ChangePasswordRequest.java index 817f9db..5328102 100644 --- a/src/main/java/com/l2/shots/auth/ChangePasswordRequest.java +++ b/src/main/java/com/l2/shots/auth/ChangePasswordRequest.java @@ -1,4 +1,7 @@ package com.l2.shots.auth; +import io.quarkus.runtime.annotations.RegisterForReflection; + +@RegisterForReflection public record ChangePasswordRequest(String currentPassword, String newPassword) { } diff --git a/src/main/java/com/l2/shots/auth/Credentials.java b/src/main/java/com/l2/shots/auth/Credentials.java index 369d3d2..e04019d 100644 --- a/src/main/java/com/l2/shots/auth/Credentials.java +++ b/src/main/java/com/l2/shots/auth/Credentials.java @@ -1,4 +1,7 @@ package com.l2.shots.auth; +import io.quarkus.runtime.annotations.RegisterForReflection; + +@RegisterForReflection public record Credentials(String username, String password) { } diff --git a/src/main/java/com/l2/shots/auth/MustChangePasswordFilter.java b/src/main/java/com/l2/shots/auth/MustChangePasswordFilter.java index 699d44f..f369008 100644 --- a/src/main/java/com/l2/shots/auth/MustChangePasswordFilter.java +++ b/src/main/java/com/l2/shots/auth/MustChangePasswordFilter.java @@ -11,6 +11,7 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.ext.Provider; import org.eclipse.microprofile.jwt.JsonWebToken; +import io.quarkus.runtime.annotations.RegisterForReflection; import java.util.Optional; @@ -60,6 +61,7 @@ public class MustChangePasswordFilter implements ContainerRequestFilter { .build()); } + @RegisterForReflection public record MustChangeBody(String error, boolean mustChangePassword) { public MustChangeBody() { this("Debe cambiar la contraseƱa antes de continuar", true); diff --git a/src/main/java/com/l2/shots/history/HistoryStats.java b/src/main/java/com/l2/shots/history/HistoryStats.java index 72a6ed9..e65178d 100644 --- a/src/main/java/com/l2/shots/history/HistoryStats.java +++ b/src/main/java/com/l2/shots/history/HistoryStats.java @@ -1,5 +1,8 @@ package com.l2.shots.history; +import io.quarkus.runtime.annotations.RegisterForReflection; + +@RegisterForReflection public record HistoryStats( int totalRuns, long totalCost, diff --git a/src/main/java/com/l2/shots/history/RunDetails.java b/src/main/java/com/l2/shots/history/RunDetails.java index 5a0fac0..007797a 100644 --- a/src/main/java/com/l2/shots/history/RunDetails.java +++ b/src/main/java/com/l2/shots/history/RunDetails.java @@ -1,9 +1,12 @@ package com.l2.shots.history; +import io.quarkus.runtime.annotations.RegisterForReflection; + import java.time.Instant; import java.util.List; import java.util.UUID; +@RegisterForReflection public record RunDetails( UUID id, Instant createdAt, diff --git a/src/main/java/com/l2/shots/history/RunIn.java b/src/main/java/com/l2/shots/history/RunIn.java index 21649fc..0f0bf22 100644 --- a/src/main/java/com/l2/shots/history/RunIn.java +++ b/src/main/java/com/l2/shots/history/RunIn.java @@ -1,7 +1,10 @@ package com.l2.shots.history; +import io.quarkus.runtime.annotations.RegisterForReflection; + import java.util.List; +@RegisterForReflection public record RunIn( String label, long totalCost, diff --git a/src/main/java/com/l2/shots/history/RunItem.java b/src/main/java/com/l2/shots/history/RunItem.java index e578332..77781e4 100644 --- a/src/main/java/com/l2/shots/history/RunItem.java +++ b/src/main/java/com/l2/shots/history/RunItem.java @@ -1,5 +1,8 @@ package com.l2.shots.history; +import io.quarkus.runtime.annotations.RegisterForReflection; + +@RegisterForReflection public record RunItem( String tipo, String grado, diff --git a/src/main/java/com/l2/shots/history/RunSnapshot.java b/src/main/java/com/l2/shots/history/RunSnapshot.java index 8bbaf46..1174d90 100644 --- a/src/main/java/com/l2/shots/history/RunSnapshot.java +++ b/src/main/java/com/l2/shots/history/RunSnapshot.java @@ -1,8 +1,11 @@ package com.l2.shots.history; +import io.quarkus.runtime.annotations.RegisterForReflection; + import java.util.List; import java.util.Map; +@RegisterForReflection public record RunSnapshot( Map insumos, List> formulas) { diff --git a/src/main/java/com/l2/shots/history/RunSummary.java b/src/main/java/com/l2/shots/history/RunSummary.java index e0ef5c2..223fd4a 100644 --- a/src/main/java/com/l2/shots/history/RunSummary.java +++ b/src/main/java/com/l2/shots/history/RunSummary.java @@ -1,8 +1,11 @@ package com.l2.shots.history; +import io.quarkus.runtime.annotations.RegisterForReflection; + import java.time.Instant; import java.util.UUID; +@RegisterForReflection public record RunSummary( UUID id, Instant createdAt, diff --git a/src/main/java/com/l2/shots/state/AppState.java b/src/main/java/com/l2/shots/state/AppState.java index f137392..11089cf 100644 --- a/src/main/java/com/l2/shots/state/AppState.java +++ b/src/main/java/com/l2/shots/state/AppState.java @@ -1,13 +1,17 @@ package com.l2.shots.state; +import io.quarkus.runtime.annotations.RegisterForReflection; + import java.util.List; import java.util.Map; +@RegisterForReflection public record AppState( Insumos insumos, List formulas, Map> disponibles) { + @RegisterForReflection public record Insumos( Map cristales, int soulOre, @@ -15,6 +19,7 @@ public record AppState( Map> venta) { } + @RegisterForReflection public record FormulaDto( String id, String tipo,