DashboardComponentResource.buildOrganizationComponent() dá erro de proxy em PROD #12

Closed
opened 2025-06-21 23:53:41 +01:00 by root · 1 comment
Owner

Ao aceder-se à opção "Emissões" quando em PROD (profile=PROD) dá erro e não é apresentado nada. Mas alterando para DEV, tudo funciona.
Depois de muito debug, o problema está no facto de em DEV o loglevel para o package com.oguerreiro.resilient é DEBUG mas em PROD é INFO.
Mas porque razão isto interfere funcionalmente ?

Quando é invocado o DashboardComponentResource.buildOrganizationComponent() é chamado o método getDashboardComponentService().buildDashboardComponentView(), este método é transacional e vai retornar um MAP com uma collection de DashboardComponentDetailValue que contém um proxy para Organization. E é DENTRO do método DashboardComponentResource.buildOrganizationComponent() que é feito o mapper para um DTO.

Em DEV, como está com loglevel DEBUG o AOP de logging vai fazer o log do exit do método getDashboardComponentService().buildDashboardComponentView(), ainda dentro da transação. E indirectamente, inicializa o proxy. Mas em PROD, o loglevel é INFO e não teremos log e portanto, não há inicialização. O resultado é que rebenta no mapping para o DTO.

Isto indicia uma pattern de erro generalizada. NUNCA deve ser feito o mapping para DTO dentro do Resource. Aliás, o mapping para DTO deve ser SEMPRE efectuado dentro do método em transação para permitir as inicializações necessárias que o DTO possa necessitar.

Ao aceder-se à opção "Emissões" quando em PROD (profile=PROD) dá erro e não é apresentado nada. Mas alterando para DEV, tudo funciona. Depois de muito debug, o problema está no facto de em DEV o loglevel para o package `com.oguerreiro.resilient` é `DEBUG` mas em PROD é `INFO`. Mas porque razão isto interfere funcionalmente ? Quando é invocado o `DashboardComponentResource.buildOrganizationComponent()` é chamado o método `getDashboardComponentService().buildDashboardComponentView()`, este método é transacional e vai retornar um MAP com uma collection de `DashboardComponentDetailValue` que contém um proxy para `Organization`. E é DENTRO do método `DashboardComponentResource.buildOrganizationComponent()` que é feito o mapper para um DTO. Em DEV, como está com loglevel DEBUG o AOP de logging vai fazer o log do exit do método `getDashboardComponentService().buildDashboardComponentView()`, ainda dentro da transação. E indirectamente, inicializa o proxy. Mas em PROD, o loglevel é INFO e não teremos log e portanto, não há inicialização. O resultado é que rebenta no mapping para o DTO. Isto indicia uma pattern de erro generalizada. NUNCA deve ser feito o mapping para DTO dentro do Resource. Aliás, o mapping para DTO deve ser SEMPRE efectuado dentro do método em transação para permitir as inicializações necessárias que o DTO possa necessitar.
root added this to the 1.0.4 milestone 2025-06-21 23:53:41 +01:00
root added the
bug
label 2025-06-21 23:53:41 +01:00
root added this to the InNOVA project 2025-06-21 23:53:43 +01:00
root referenced this issue from a commit 2025-06-21 23:58:46 +01:00
Author
Owner

DashboardComponentResource está agora livre de qualquer mapper.

NOTA: Eu acho que deveria rever todas as classes *Resource e repetir este raciocinio, ou poderei ter este erro em muitos mais pontos da APP.

`DashboardComponentResource` está agora livre de qualquer mapper. NOTA: Eu acho que deveria rever todas as classes *Resource e repetir este raciocinio, ou poderei ter este erro em muitos mais pontos da APP.
root closed this issue 2025-06-22 00:00:26 +01:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: root/resilient#12
No description provided.