From 96d6099cc1c4e8b482b528f4d6ffe39b212dc190 Mon Sep 17 00:00:00 2001 From: "mark.vituska" Date: Wed, 28 May 2025 15:17:07 +0200 Subject: [PATCH] FINERACT-2304 - fix entity manager usage only through persistence context annotation --- .../fineract/batch/service/BatchApiServiceImpl.java | 8 ++++++-- .../infrastructure/core/jpa/CriteriaQueryFactory.java | 4 +++- .../CustomExternalEventConfigurationRepositoryImpl.java | 2 +- .../domain/search/SearchingClientRepositoryImpl.java | 5 ++++- .../fineract/batch/service/BatchApiServiceImplTest.java | 1 + .../search/SearchingExternalAssetOwnerRepositoryImpl.java | 5 ++++- .../loanaccount/domain/LoanSummaryBalancesRepository.java | 5 ++++- .../loanaccount/service/LoanChargePaidByReadService.java | 5 ++++- .../loanaccount/service/LoanTransactionReadService.java | 4 +++- .../service/LoanTransactionRelationReadService.java | 5 ++++- .../cob/domain/CustomLoanAccountLockRepositoryImpl.java | 5 ++++- ...ustomExternalEventConfigurationRepositoryImplTest.java | 8 ++------ 12 files changed, 40 insertions(+), 17 deletions(-) diff --git a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java index 88faa67f9..9a7851a3d 100644 --- a/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/batch/service/BatchApiServiceImpl.java @@ -90,8 +90,7 @@ public class BatchApiServiceImpl implements BatchApiService { private final List batchPreprocessors; - @PersistenceContext - private final EntityManager entityManager; + private EntityManager entityManager; /** * Run each request root step in a separated transaction @@ -380,4 +379,9 @@ public class BatchApiServiceImpl implements BatchApiService { return new BatchResponse().setRequestId(requestId).setStatusCode(statusCode == null ? SC_INTERNAL_SERVER_ERROR : statusCode) .setBody(body == null ? "Request with id " + requestId + " was erroneous!" : body).setHeaders(headers); } + + @PersistenceContext + public void setEntityManager(EntityManager entityManager) { + this.entityManager = entityManager; + } } diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/jpa/CriteriaQueryFactory.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/jpa/CriteriaQueryFactory.java index 08bc10925..136a2ed94 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/jpa/CriteriaQueryFactory.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/jpa/CriteriaQueryFactory.java @@ -19,6 +19,7 @@ package org.apache.fineract.infrastructure.core.jpa; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -41,7 +42,8 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class CriteriaQueryFactory { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; public List ordersFromPageable(Pageable pageable, CriteriaBuilder cb, Root root) { return ordersFromPageable(pageable, cb, root, () -> null); diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/CustomExternalEventConfigurationRepositoryImpl.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/CustomExternalEventConfigurationRepositoryImpl.java index 2f30a85b1..d32bf4405 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/CustomExternalEventConfigurationRepositoryImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/repository/CustomExternalEventConfigurationRepositoryImpl.java @@ -30,7 +30,7 @@ import org.springframework.stereotype.Component; public class CustomExternalEventConfigurationRepositoryImpl implements CustomExternalEventConfigurationRepository { @PersistenceContext - private final EntityManager entityManager; + private EntityManager entityManager; @Override public ExternalEventConfiguration findExternalEventConfigurationByTypeWithNotFoundDetection(String externalEventType) { diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java index f038ce7c5..94cf4e2dc 100644 --- a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/search/SearchingClientRepositoryImpl.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.client.domain.search; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -44,7 +45,9 @@ import org.springframework.stereotype.Repository; @RequiredArgsConstructor public class SearchingClientRepositoryImpl implements SearchingClientRepository { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; + private final CriteriaQueryFactory criteriaQueryFactory; @Override diff --git a/fineract-core/src/test/java/org/apache/fineract/batch/service/BatchApiServiceImplTest.java b/fineract-core/src/test/java/org/apache/fineract/batch/service/BatchApiServiceImplTest.java index 2dd6373b1..11a831860 100644 --- a/fineract-core/src/test/java/org/apache/fineract/batch/service/BatchApiServiceImplTest.java +++ b/fineract-core/src/test/java/org/apache/fineract/batch/service/BatchApiServiceImplTest.java @@ -66,6 +66,7 @@ class BatchApiServiceImplTest { @BeforeEach void setUp() { + batchApiService.setEntityManager(entityManager); request = new BatchRequest(); request.setRequestId(1L); request.setMethod("POST"); diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/search/SearchingExternalAssetOwnerRepositoryImpl.java b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/search/SearchingExternalAssetOwnerRepositoryImpl.java index 48033fcbe..7ebc5c7a2 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/domain/search/SearchingExternalAssetOwnerRepositoryImpl.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/domain/search/SearchingExternalAssetOwnerRepositoryImpl.java @@ -19,6 +19,7 @@ package org.apache.fineract.investor.domain.search; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -46,7 +47,9 @@ import org.springframework.stereotype.Repository; @RequiredArgsConstructor public class SearchingExternalAssetOwnerRepositoryImpl implements SearchingExternalAssetOwnerRepository { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; + private final CriteriaQueryFactory criteriaQueryFactory; @Override diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryBalancesRepository.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryBalancesRepository.java index 720597967..18b4bac5c 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryBalancesRepository.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanSummaryBalancesRepository.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.loanaccount.domain; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -41,7 +42,9 @@ import org.springframework.stereotype.Repository; @RequiredArgsConstructor public class LoanSummaryBalancesRepository { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; + private final CriteriaQueryFactory criteriaQueryFactory; public Collection retrieveLoanSummaryBalancesByTransactionType(final Long loanId, diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargePaidByReadService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargePaidByReadService.java index 5e885251a..ae2b4b806 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargePaidByReadService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanChargePaidByReadService.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.loanaccount.service; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -42,7 +43,9 @@ import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor public class LoanChargePaidByReadService { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; + private final LoanChargePaidByMapper loanChargePaidByMapper; public List fetchLoanChargesPaidByDataTransactionId(Long transactionId) { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionReadService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionReadService.java index f8a614bca..6f6d7fcb1 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionReadService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionReadService.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.loanaccount.service; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -41,7 +42,8 @@ import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor public class LoanTransactionReadService { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; public List fetchLoanTransactionsByType(final Long loanId, final String externalId, final LoanTransactionType transactionType) { diff --git a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionRelationReadService.java b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionRelationReadService.java index 9a4ad1727..504ea4ebf 100644 --- a/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionRelationReadService.java +++ b/fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanTransactionRelationReadService.java @@ -19,6 +19,7 @@ package org.apache.fineract.portfolio.loanaccount.service; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -42,7 +43,9 @@ import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor public class LoanTransactionRelationReadService { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; + private final LoanTransactionRelationMapper loanTransactionRelationMapper; public List fetchLoanTransactionRelationDataFrom(final Long transactionId) { diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/domain/CustomLoanAccountLockRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/domain/CustomLoanAccountLockRepositoryImpl.java index 1a4a3e908..98f2a0ae8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/domain/CustomLoanAccountLockRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/domain/CustomLoanAccountLockRepositoryImpl.java @@ -19,6 +19,7 @@ package org.apache.fineract.cob.domain; import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator; import org.springframework.stereotype.Repository; @@ -27,7 +28,9 @@ import org.springframework.stereotype.Repository; @RequiredArgsConstructor public class CustomLoanAccountLockRepositoryImpl implements CustomLoanAccountLockRepository { - private final EntityManager entityManager; + @PersistenceContext + private EntityManager entityManager; + private final DatabaseSpecificSQLGenerator databaseSpecificSQLGenerator; @Override diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java index ed708f144..fe8a613db 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/event/external/service/CustomExternalEventConfigurationRepositoryImplTest.java @@ -28,9 +28,9 @@ import jakarta.persistence.EntityManager; import org.apache.fineract.infrastructure.event.external.exception.ExternalEventConfigurationNotFoundException; import org.apache.fineract.infrastructure.event.external.repository.CustomExternalEventConfigurationRepositoryImpl; import org.apache.fineract.infrastructure.event.external.repository.domain.ExternalEventConfiguration; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; @@ -41,13 +41,9 @@ public class CustomExternalEventConfigurationRepositoryImplTest { @Mock private EntityManager entityManager; + @InjectMocks private CustomExternalEventConfigurationRepositoryImpl underTest; - @BeforeEach - public void setUp() { - underTest = new CustomExternalEventConfigurationRepositoryImpl(entityManager); - } - @Test public void givenConfigurationExistsThenReturnConfiguration() { // given