This is an automated email from the ASF dual-hosted git repository. adamsaghy pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/fineract.git
commit 56f0b83d40facb8dd38bac3865bd70747f2299ae Author: Oleksii Novikov <[email protected]> AuthorDate: Wed Aug 13 14:55:05 2025 +0300 FINERACT-2343: Fix update currency api validation --- .../JakartaValidationExceptionMapper.java | 21 +++++++++++++++++---- .../monetary/api/CurrenciesApiResource.java | 3 ++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JakartaValidationExceptionMapper.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JakartaValidationExceptionMapper.java index 04641cb2a8..00980f0e5a 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JakartaValidationExceptionMapper.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/exceptionmapper/JakartaValidationExceptionMapper.java @@ -25,22 +25,28 @@ import jakarta.ws.rs.core.Response.Status; import jakarta.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.Provider; import java.util.List; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.data.ApiGlobalErrorResponse; import org.apache.fineract.infrastructure.core.data.ApiParameterError; import org.apache.fineract.infrastructure.core.exception.ErrorHandler; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; @Slf4j @Provider @Component +@RequiredArgsConstructor public class JakartaValidationExceptionMapper implements FineractExceptionMapper, ExceptionMapper<ConstraintViolationException> { + private final MessageSource messageSource; + @Override public Response toResponse(final ConstraintViolationException exception) { log.warn("Exception occurred", ErrorHandler.findMostSpecificException(exception)); - final ApiGlobalErrorResponse dataValidationErrorResponse = ApiGlobalErrorResponse.badClientRequest(exception.getMessage(), - exception.getLocalizedMessage(), getApiParameterErrors(exception)); + final ApiGlobalErrorResponse dataValidationErrorResponse = ApiGlobalErrorResponse + .badClientRequest("validation.msg.validation.errors.exist", "Validation errors exist.", getApiParameterErrors(exception)); return Response.status(Status.BAD_REQUEST).entity(dataValidationErrorResponse).type(MediaType.APPLICATION_JSON).build(); } @@ -51,7 +57,14 @@ public class JakartaValidationExceptionMapper implements FineractExceptionMapper } private List<ApiParameterError> getApiParameterErrors(final ConstraintViolationException exception) { - return exception.getConstraintViolations().stream().map(violation -> ApiParameterError - .parameterError(violation.getMessageTemplate(), violation.getMessage(), violation.getPropertyPath().toString())).toList(); + return exception.getConstraintViolations().stream().map(violation -> { + final String messageTemplate = violation.getMessageTemplate(); + final String messageKey = messageTemplate.replace("{", "").replace("}", ""); + + final String interpolatedMessage = messageSource.getMessage(messageKey, null, LocaleContextHolder.getLocale()); + + return ApiParameterError.parameterError(messageKey, interpolatedMessage, violation.getPropertyPath().toString()); + }).toList(); } + } diff --git a/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java index efea32844b..a1a0f6cdf8 100644 --- a/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java +++ b/fineract-core/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java @@ -20,6 +20,7 @@ package org.apache.fineract.organisation.monetary.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.GET; import jakarta.ws.rs.PUT; @@ -66,7 +67,7 @@ public class CurrenciesApiResource { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Update Currency Configuration", description = "Updates the list of currencies permitted for use.") - public CurrencyUpdateResponse updateCurrencies(CurrencyUpdateRequest request) { + public CurrencyUpdateResponse updateCurrencies(@Valid CurrencyUpdateRequest request) { final var command = new CurrencyUpdateCommand(); command.setId(UUID.randomUUID());
