Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
7c8ef4e
FINERACT-2621: flip build to Spring Boot 4.0.7
avivijay19 Jun 30, 2026
9d454e0
FINERACT-2621: migrate fineract-core to Spring Batch 6
avivijay19 Jun 30, 2026
9e1be52
FINERACT-2621: migrate fineract-cob to Spring Batch 6
avivijay19 Jun 30, 2026
14812b5
FINERACT-2621: migrate fineract-security to Spring Framework 7
avivijay19 Jul 6, 2026
da9e2e3
FINERACT-2621: migrate fineract-accounting to Spring Batch 6
avivijay19 Jul 6, 2026
dc0d880
FINERACT-2621: migrate fineract-loan to Spring Batch 6 and Jackson 3
avivijay19 Jul 6, 2026
2a5d5e8
FINERACT-2621: switch fineract-investor to JSpecify annotations
avivijay19 Jul 6, 2026
4c7cf55
FINERACT-2621: migrate fineract-working-capital-loan to Spring Batch 6
avivijay19 Jul 6, 2026
b4d020b
FINERACT-2621: switch fineract-progressive-loan to JSpecify annotations
avivijay19 Jul 6, 2026
a5e599b
FINERACT-2621: switch fineract-savings to JSpecify annotations
avivijay19 Jul 6, 2026
95ee472
FINERACT-2621: migrate fineract-core to Jackson 3 and JSpecify
avivijay19 Jul 6, 2026
7caed5b
FINERACT-2621: switch fineract-cob to JSpecify annotations
avivijay19 Jul 6, 2026
2fc1ffb
FINERACT-2621: migrate fineract-command-jdbc to Jackson 3
avivijay19 Jul 6, 2026
0ab49ac
FINERACT-2621: migrate fineract-provider core config to Spring Boot 4…
avivijay19 Jul 6, 2026
e749ade
FINERACT-2621: migrate fineract-provider to Security 7 and Jersey 4
avivijay19 Jul 6, 2026
1942beb
FINERACT-2621: migrate fineract-provider to Spring Batch 6
avivijay19 Jul 6, 2026
cb6f441
FINERACT-2621: force spring-core 6.2 on the buildscript classpath
avivijay19 Jul 6, 2026
19f8368
FINERACT-2621: migrate custom acme job to Spring Batch 6
avivijay19 Jul 6, 2026
e141eba
FINERACT-2621: migrate fineract-provider server code to Jackson 3
avivijay19 Jul 7, 2026
f18b455
FINERACT-2621: switch fineract-provider to JSpecify annotations
avivijay19 Jul 7, 2026
5c33485
FINERACT-2621: replace deprecated Spring Batch APIs in fineract-provider
avivijay19 Jul 7, 2026
e668192
FINERACT-2621: replace deprecated Spring Batch APIs in fineract-cob
avivijay19 Jul 7, 2026
e534a0f
FINERACT-2621: replace deprecated Spring Batch APIs in fineract-worki…
avivijay19 Jul 7, 2026
4a85465
FINERACT-2621: suppress SpotBugs warning uncovered by JSpecify swap
avivijay19 Jul 7, 2026
7190591
FINERACT-2621: add Spring Batch 6 Liquibase changeset
avivijay19 Jul 7, 2026
ca860b0
FINERACT-2621: bridge commons-logging to SLF4J after spring-jcl removal
avivijay19 Jul 8, 2026
9044d6e
FINERACT-2621: migrate renamed configuration property keys
avivijay19 Jul 8, 2026
5a380bb
FINERACT-2621: fix fineract-provider test sources for Spring Batch 6 …
avivijay19 Jul 8, 2026
d1731f2
FINERACT-2621: fix fineract-command test compilation on Boot 4
avivijay19 Jul 8, 2026
263e75c
FINERACT-2621: fix fineract-command-async test compilation on Boot 4
avivijay19 Jul 8, 2026
e415369
FINERACT-2621: fix fineract-command-audit test compilation on Boot 4
avivijay19 Jul 8, 2026
99488e0
FINERACT-2621: migrate custom acme job test to Spring Batch 6
avivijay19 Jul 8, 2026
31a293e
FINERACT-2621: run integration-tests container on Tomcat 11
avivijay19 Jul 8, 2026
6741c6a
FINERACT-2621: run oauth2-tests container on Tomcat 11
avivijay19 Jul 8, 2026
b23dd9b
FINERACT-2621: run twofactor-tests container on Tomcat 11
avivijay19 Jul 8, 2026
e1d3ec7
FINERACT-2621: adapt JobExecution proxy to Spring Batch 6 constructor
avivijay19 Jul 8, 2026
c2e2091
FINERACT-2621: drop reserved JPQL alias rejected by EclipseLink 5
avivijay19 Jul 8, 2026
185f916
FINERACT-2621: fix provider runtime wiring for Boot 4 startup
avivijay19 Jul 8, 2026
eba9e3c
FINERACT-2621: align test dependencies with JUnit 6 and Boot 4
avivijay19 Jul 8, 2026
582a829
FINERACT-2621: define the Spring Data JDBC dialect explicitly
avivijay19 Jul 8, 2026
d6a4aee
FINERACT-2621: fix provider unit tests for Boot 4 behavior changes
avivijay19 Jul 8, 2026
b07f574
FINERACT-2621: bump EclipseLink to 5.0.1
avivijay19 Jul 10, 2026
f274b78
FINERACT-2621: reuse enhanced executions in StepSynchronizationManager
avivijay19 Jul 10, 2026
4d34813
FINERACT-2621: adapt COB item processing to Batch 6 chunk semantics
avivijay19 Jul 10, 2026
8997eba
FINERACT-2621: propagate step context to COB worker threads
avivijay19 Jul 10, 2026
54e8fc1
FINERACT-2621: fix working capital COB step wiring for Batch 6
avivijay19 Jul 10, 2026
20e14b8
FINERACT-2621: fix trial balance date mapping under EclipseLink 5
avivijay19 Jul 10, 2026
cb0ba1f
FINERACT-2621: fix provider COB job runtime for Batch 6
avivijay19 Jul 10, 2026
eaa853a
FINERACT-2621: guard accrual reprocessing against unsaved loans
avivijay19 Jul 10, 2026
8077590
FINERACT-2621: keep lenient loan id parsing in COB api filters
avivijay19 Jul 10, 2026
2af34ed
FINERACT-2621: restore JSON error contract in Jersey body reader
avivijay19 Jul 10, 2026
e486311
FINERACT-2621: fix external event query rejected by EclipseLink 5
avivijay19 Jul 11, 2026
a3df513
FINERACT-2621: move Batch Kafka messaging to Jackson 3 serializers
avivijay19 Jul 11, 2026
196fb7c
FINERACT-2621: allow duplicated public suffix list on test classpath
avivijay19 Jul 11, 2026
5e1629d
FINERACT-2621: add missing Override in COB item processor
avivijay19 Jul 11, 2026
2564aa5
FINERACT-2621: add missing Overrides in working capital COB workers
avivijay19 Jul 11, 2026
4711dd4
FINERACT-2621: add missing Overrides in provider COB classes
avivijay19 Jul 11, 2026
72d38d5
FINERACT-2621: stub loan id in accrual reprocessing test
avivijay19 Jul 11, 2026
5755bd3
FINERACT-2621: bump Spring Boot to 4.1.0
avivijay19 Jul 11, 2026
3737129
FINERACT-2621: size COB worker queue for Batch 6 chunk submission
avivijay19 Jul 13, 2026
87829d1
FINERACT-2621: size working capital COB worker queue for Batch 6
avivijay19 Jul 13, 2026
05bbe8c
FINERACT-2621: enable Kafka listener processing in batch worker
avivijay19 Jul 13, 2026
c8a0f53
FINERACT-2621: emit Jackson 3 annotations for Jacksonized classes
avivijay19 Jul 14, 2026
d12a5ea
Merge remote-tracking branch 'apache/develop' into FINERACT-2621/spri…
avivijay19 Jul 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
22 changes: 19 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,18 @@ buildscript {
maven { url 'https://plugins.gradle.org/m2/' }
}

configurations.classpath {
resolutionStrategy {
// The Spring Boot 4 Gradle plugin pulls spring-core 7.x onto the shared buildscript
// classpath, but the hierynomus license plugin's transitive license-maven-plugin:3.0
// needs a PropertyPlaceholderHelper constructor that Spring Framework 7 removed.
force 'org.springframework:spring-core:6.2.18'
}
}

dependencies {
classpath 'com.bmuschko:gradle-cargo-plugin:2.9.0'
classpath 'org.eclipse.persistence:eclipselink:4.0.9'
classpath 'org.eclipse.persistence:eclipselink:5.0.1'
classpath 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0'
classpath 'com.google.cloud.tools:jib-layer-filter-extension-gradle:0.3.0'
classpath 'org.apache.commons:commons-lang3:3.20.0'
Expand All @@ -117,7 +126,7 @@ plugins {
id 'com.github.hierynomus.license' version '0.16.1' apply false
id 'com.github.jk1.dependency-license-report' version '2.9' apply false
id 'org.zeroturnaround.gradle.jrebel' version '1.2.2' apply false
id 'org.springframework.boot' version '3.5.15' apply false
id 'org.springframework.boot' version '4.1.0' apply false
id 'net.ltgt.errorprone' version '4.4.0' apply false
id 'io.swagger.core.v3.swagger-gradle-plugin' version '2.2.49' apply false
id 'com.gorylenko.gradle-git-properties' version '2.5.7' apply false
Expand Down Expand Up @@ -418,6 +427,11 @@ configure(project.fineractJavaProjects) {
options.incremental = true
options.fork = true
outputs.cacheIf { true }
// Lombok reads lombok.config at compile time; without this input, cached or
// incremental builds can reuse classes generated under an older config
inputs.file(rootProject.file('lombok.config'))
.withPropertyName('lombokConfig')
.withPathSensitivity(PathSensitivity.NONE)
options.compilerArgs << '-parameters'
options.encoding = 'UTF-8'
options.compilerArgs << '-Xlint:unchecked'
Expand Down Expand Up @@ -704,6 +718,9 @@ configure(project.fineractJavaProjects) {
'org.slf4j:slf4j-api',
'org.slf4j:log4j-over-slf4j',
'org.slf4j:jul-to-slf4j',
// Spring Framework 7 removed spring-jcl (which provided org.apache.commons.logging);
// commons-logging itself is excluded globally, so bridge JCL to SLF4J everywhere
'org.slf4j:jcl-over-slf4j',
)
implementation ("ch.qos.logback:logback-classic") {
exclude(module: "slf4j-api")
Expand Down Expand Up @@ -829,7 +846,6 @@ configure(project.fineractCustomProjects) {
exclude group: 'org.skyscreamer'
}
testImplementation( 'org.mockito:mockito-core',
'org.mockito:mockito-inline',
'org.mockito:mockito-junit-jupiter',
'org.junit.jupiter:junit-jupiter-api',
'org.junit.jupiter:junit-jupiter-engine',
Expand Down
27 changes: 10 additions & 17 deletions buildSrc/src/main/groovy/org.apache.fineract.dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,18 @@ dependencyManagement {
mavenBom 'com.squareup.okhttp3:okhttp-bom:4.12.0'
mavenBom 'org.slf4j:slf4j-bom:2.0.17'
mavenBom 'io.micrometer:micrometer-bom:1.16.5'
mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.15'
mavenBom 'org.springframework.boot:spring-boot-dependencies:4.1.0'
mavenBom 'io.awspring.cloud:spring-cloud-aws-dependencies:4.0.2'
mavenBom 'io.opentelemetry:opentelemetry-bom:1.62.0'
mavenBom 'org.jetbrains.kotlin:kotlin-bom:2.3.21'
mavenBom 'org.junit:junit-bom:5.14.4'
mavenBom 'org.junit:junit-bom:6.0.3'
mavenBom 'com.fasterxml.jackson:jackson-bom:2.22.1'
mavenBom 'io.cucumber:cucumber-bom:7.34.3'
mavenBom 'org.mockito:mockito-bom:5.23.0'
mavenBom 'software.amazon.awssdk:bom:2.44.4'
mavenBom 'io.github.resilience4j:resilience4j-bom:2.4.0'
mavenBom 'org.testcontainers:testcontainers-bom:1.21.4'
mavenBom 'org.glassfish.jersey:jersey-bom:3.1.11'
mavenBom 'org.glassfish.jersey:jersey-bom:4.0.2'
}

dependencies {
Expand All @@ -50,7 +50,7 @@ dependencyManagement {
dependency 'ch.qos.logback.contrib:logback-jackson:0.1.5'
dependency 'org.codehaus.janino:janino:3.1.12'

dependency 'org.eclipse.persistence:org.eclipse.persistence.jpa:4.0.9'
dependency 'org.eclipse.persistence:org.eclipse.persistence.jpa:5.0.1'
dependency 'com.google.guava:guava:33.6.0-jre'
dependency 'com.google.code.gson:gson:2.14.0'
dependency 'com.google.googlejavaformat:google-java-format:1.35.0'
Expand Down Expand Up @@ -184,7 +184,7 @@ dependencyManagement {
dependency 'com.vdurmont:semver4j:3.1.0'
dependency 'org.beryx:text-io:3.4.1'

dependency ('org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.17') {
dependency ('org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.3') {
exclude 'io.swagger.core.v3:swagger-core'
}

Expand Down Expand Up @@ -259,7 +259,6 @@ dependencyManagement {
dependency 'org.apache.commons:commons-math3:3.6.1'
dependency 'commons-beanutils:commons-beanutils:1.11.0'

dependency 'org.mockito:mockito-inline:5.2.0'

dependency 'org.wiremock:wiremock-standalone:3.13.2'
dependency 'org.apache.sshd:sshd-common:2.17.1'
Expand All @@ -275,10 +274,7 @@ dependencyManagement {
dependency 'org.openjdk.jmh:jmh-core:1.37'
dependency 'org.openjdk.jmh:jmh-generator-annprocess:1.37'

dependency 'org.springframework.restdocs:spring-restdocs-asciidoctor:3.0.5'
dependency 'org.springframework.restdocs:spring-restdocs-mockmvc:3.0.5'
dependency 'org.springframework.restdocs:spring-restdocs-webtestclient:3.0.5'
dependency 'org.springframework.restdocs:spring-restdocs-restassured:3.0.5'
// spring-restdocs (4.0.x) now managed by the Spring Boot 4 BOM

dependency 'com.lmax:disruptor:4.0.0'

Expand All @@ -292,8 +288,9 @@ dependencyManagement {
dependency 'org.yakworks:spring-icu4j:0.5.2'
dependency 'org.apache.commons:commons-lang3:3.20.0'
dependency 'com.nimbusds:nimbus-jose-jwt:10.9'
dependency 'org.springframework:spring-core:6.2.18'
dependency 'org.springframework.security:spring-security-core:6.5.10'
// spring-core & spring-security-core now come from the Spring Boot 4 BOM (Spring Framework 7 / Security 7)
// resilience4j-bom does not manage the spring-boot4 starter variant — pin it explicitly:
dependency 'io.github.resilience4j:resilience4j-spring-boot4:2.4.0'
// Keep Netty on the 4.1 line for MockServer compatibility.
dependency 'io.netty:netty-buffer:4.1.135.Final'
dependency 'io.netty:netty-common:4.1.135.Final'
Expand All @@ -312,10 +309,6 @@ dependencyManagement {
dependency 'io.netty:netty-transport-classes-epoll:4.1.135.Final'
dependency 'io.netty:netty-transport-native-unix-common:4.1.135.Final'
dependency 'at.yawk.lz4:lz4-java:1.11.0'
dependency 'org.thymeleaf:thymeleaf:3.1.5.RELEASE'
dependency 'org.thymeleaf:thymeleaf-spring6:3.1.5.RELEASE'
dependency 'org.apache.tomcat.embed:tomcat-embed-core:10.1.55'
dependency 'org.apache.tomcat.embed:tomcat-embed-el:10.1.55'
dependency 'org.apache.tomcat.embed:tomcat-embed-websocket:10.1.55'
// thymeleaf + thymeleaf-spring7 and Tomcat 11 embed now come from the Spring Boot 4 BOM
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
package com.acme.fineract.loan.job;

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.job.parameters.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.Step;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
package com.acme.fineract.loan.job;

import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.StepContribution;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.batch.infrastructure.repeat.RepeatStatus;
import org.springframework.stereotype.Component;

@Slf4j
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@
* under the License.
*/
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.springframework.batch.repeat.RepeatStatus.FINISHED;
import static org.springframework.batch.infrastructure.repeat.RepeatStatus.FINISHED;

import com.acme.fineract.loan.job.AcmeNoopJobTasklet;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.batch.core.step.StepContribution;
import org.springframework.batch.infrastructure.repeat.RepeatStatus;

@ExtendWith(MockitoExtension.class)
public class AcmeNoopJobTaskletTest {
Expand Down
7 changes: 3 additions & 4 deletions fineract-accounting/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ dependencies {
)

implementation(
'org.springframework.boot:spring-boot-starter-web',
'org.springframework.boot:spring-boot-starter-webmvc',
'org.springframework.boot:spring-boot-starter-security',
'org.springframework.boot:spring-boot-starter-batch',
'org.springframework.boot:spring-boot-starter-batch-jdbc',
'org.springframework.batch:spring-batch-integration',
'jakarta.ws.rs:jakarta.ws.rs-api',
'org.glassfish.jersey.media:jersey-media-multipart',
Expand All @@ -53,7 +53,7 @@ dependencies {
'org.springdoc:springdoc-openapi-starter-webmvc-ui',
'org.mapstruct:mapstruct',

'io.github.resilience4j:resilience4j-spring-boot3',
'io.github.resilience4j:resilience4j-spring-boot4',
)
compileOnly 'com.github.spotbugs:spotbugs-annotations'
compileOnly 'org.projectlombok:lombok'
Expand All @@ -76,5 +76,4 @@ dependencies {
exclude group: 'javax.activation'
exclude group: 'org.skyscreamer'
}
testImplementation ('org.mockito:mockito-inline')
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@
import org.apache.fineract.accounting.journalentry.domain.JournalEntryRepository;
import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourceServiceFactory;
import org.apache.fineract.infrastructure.jobs.service.JobName;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.job.parameters.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.Step;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -30,10 +31,10 @@
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.core.service.database.RoutingDataSourceServiceFactory;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.StepContribution;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.batch.infrastructure.repeat.RepeatStatus;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.CollectionUtils;

Expand Down Expand Up @@ -77,7 +78,9 @@ private void insertTrialBalanceForDate(LocalDate tbGap) {
tb.setGlAccountId((Long) row[1]);
tb.setAmount((BigDecimal) row[2]);
tb.setEntryDate((LocalDate) row[3]);
tb.setTransactionDate((LocalDate) row[4]);
// je.createdDate is the OffsetDateTime audit field; EclipseLink 5 materializes it as such in
// Object[] projections where EclipseLink 4 handed back a date-castable value
tb.setTransactionDate(((OffsetDateTime) row[4]).toLocalDate());
tb.setClosingBalance((BigDecimal) row[5]);
return tb;
}).toList();
Expand Down
5 changes: 2 additions & 3 deletions fineract-branch/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ dependencies {
implementation(project(path: ':fineract-accounting'))

implementation(
'org.springframework.boot:spring-boot-starter-web',
'org.springframework.boot:spring-boot-starter-webmvc',
'org.springframework.boot:spring-boot-starter-security',
'jakarta.ws.rs:jakarta.ws.rs-api',
'org.glassfish.jersey.media:jersey-media-multipart',
Expand All @@ -47,7 +47,7 @@ dependencies {
'org.springdoc:springdoc-openapi-starter-webmvc-ui',
'org.mapstruct:mapstruct',

'io.github.resilience4j:resilience4j-spring-boot3',
'io.github.resilience4j:resilience4j-spring-boot4',
'org.apache.httpcomponents:httpcore',
)
compileOnly 'com.github.spotbugs:spotbugs-annotations'
Expand All @@ -71,5 +71,4 @@ dependencies {
exclude group: 'javax.activation'
exclude group: 'org.skyscreamer'
}
testImplementation ('org.mockito:mockito-inline')
}
5 changes: 2 additions & 3 deletions fineract-charge/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ dependencies {
implementation(project(path: ':fineract-tax'))

implementation(
'org.springframework.boot:spring-boot-starter-web',
'org.springframework.boot:spring-boot-starter-webmvc',
'org.springframework.boot:spring-boot-starter-security',
'jakarta.ws.rs:jakarta.ws.rs-api',
'org.glassfish.jersey.media:jersey-media-multipart',
Expand All @@ -47,7 +47,7 @@ dependencies {
'org.springdoc:springdoc-openapi-starter-webmvc-ui',
'org.mapstruct:mapstruct',

'io.github.resilience4j:resilience4j-spring-boot3',
'io.github.resilience4j:resilience4j-spring-boot4',
'org.apache.httpcomponents:httpcore',
)
compileOnly 'com.github.spotbugs:spotbugs-annotations'
Expand All @@ -71,5 +71,4 @@ dependencies {
exclude group: 'javax.activation'
exclude group: 'org.skyscreamer'
}
testImplementation ('org.mockito:mockito-inline')
}
4 changes: 2 additions & 2 deletions fineract-client-feign/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ dependencies {

// Test dependencies
testImplementation(
'org.junit.jupiter:junit-jupiter-api:5.14.4',
'org.junit.jupiter:junit-jupiter-engine:5.14.4',
'org.junit.jupiter:junit-jupiter-api',
'org.junit.jupiter:junit-jupiter-engine',
'org.mockito:mockito-core:5.23.0',
'org.assertj:assertj-core:3.27.7',
'org.wiremock:wiremock-standalone'
Expand Down
8 changes: 8 additions & 0 deletions fineract-client/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -270,3 +270,11 @@ configurations {
generatedCompileClasspath.extendsFrom implementation
generatedRuntimeClasspath.extendsFrom runtimeClasspath
}

// The generated SDK targets Java 8; JUnit 6 (managed by the Boot 4 BOM) requires JVM 17+,
// so keep this module's test stack on the JUnit 5 line
dependencyManagement {
imports {
mavenBom 'org.junit:junit-bom:5.14.4'
}
}
7 changes: 3 additions & 4 deletions fineract-cob/dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ dependencies {

// implementation dependencies are directly used (compiled against) in src/main (and src/test)
implementation(
'org.springframework.boot:spring-boot-starter-web',
'org.springframework.boot:spring-boot-starter-webmvc',
'org.springframework.boot:spring-boot-starter-security',
'org.springframework.boot:spring-boot-starter-validation',
'org.springframework.boot:spring-boot-starter-batch',
'org.springframework.boot:spring-boot-starter-batch-jdbc',
'org.springframework.batch:spring-batch-integration',
'jakarta.ws.rs:jakarta.ws.rs-api',
'org.glassfish.jersey.media:jersey-media-multipart',
Expand All @@ -54,7 +54,7 @@ dependencies {
'org.springdoc:springdoc-openapi-starter-webmvc-ui',
'org.mapstruct:mapstruct',

'io.github.resilience4j:resilience4j-spring-boot3',
'io.github.resilience4j:resilience4j-spring-boot4',
'org.apache.httpcomponents:httpcore',
)
implementation ('org.springframework.boot:spring-boot-starter-data-jpa') {
Expand Down Expand Up @@ -123,7 +123,6 @@ dependencies {
implementation ('org.quartz-scheduler:quartz') {
exclude group: 'com.zaxxer', module: 'HikariCP-java7'
}
testImplementation ('org.mockito:mockito-inline')
implementation('org.apache.avro:avro')
implementation(
project(path: ':fineract-avro-schemas')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import java.util.TreeMap;
import org.apache.fineract.cob.data.BusinessStepNameAndOrder;
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
import org.springframework.lang.NonNull;
import org.jspecify.annotations.NonNull;

public interface COBBusinessStepService {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,11 @@
import org.apache.fineract.infrastructure.core.domain.ActionContext;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
import org.jspecify.annotations.NonNull;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Slf4j
Expand All @@ -56,6 +57,10 @@ public class COBBusinessStepServiceImpl implements COBBusinessStepService {

@SuppressWarnings({ "unchecked" })
@Override
// Spring Batch 6 ChunkOrientedStep runs item processing on task-executor threads OUTSIDE the chunk transaction,
// so the business step chain must open its own transaction there; in sequential mode REQUIRED simply joins the
// chunk transaction, matching the Batch 5 behavior
@Transactional
public <T extends COBBusinessStep<S>, S extends AbstractPersistableCustom<Long>> S run(TreeMap<Long, String> executionMap, S item) {
if (executionMap == null || executionMap.isEmpty()) {
throw new BusinessStepException("Execution map is empty! COB Business step execution skipped!");
Expand Down
Loading
Loading