From 4e0eeb77f6b4aa63a9817b3c200ec58726de95b5 Mon Sep 17 00:00:00 2001 From: Karan Date: Mon, 19 May 2025 19:58:56 +0200 Subject: [PATCH 1/4] CM-Test - All 4 answers fetched with basic validations --- pom.xml | 17 +++ .../cmcodingchallenge/RestTemplateConfig.java | 17 +++ .../cmcodingchallenge/currency/Currency.java | 33 +++++ .../currency/CurrencyConstants.java | 47 +++++++ .../currency/CurrencyController.java | 22 --- .../currency/CurrencyWrapper.java | 19 +++ .../CurrencyController.java | 63 +++++++++ .../currencydto/FXRequestDto.java | 45 ++++++ .../CurrencyRepository.java | 9 ++ .../currencyservice/CurrencyService.java | 18 +++ .../currencyservice/CurrencyServiceImpl.java | 129 ++++++++++++++++++ .../exception/GlobalExceptionHandler.java | 69 ++++++++++ .../exception/InvalidRequestException.java | 8 ++ .../cmcodingchallenge/xmldata/DataSet.java | 9 ++ .../xmldata/GenericData.java | 13 ++ .../xmldata/ObsDimension.java | 8 ++ .../cmcodingchallenge/xmldata/ObsValue.java | 8 ++ .../xmldata/Observation.java | 12 ++ .../cmcodingchallenge/xmldata/Series.java | 13 ++ src/main/resources/application.properties | 18 +++ 20 files changed, 555 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyConstants.java delete mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyController.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyWrapper.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/exception/InvalidRequestException.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/xmldata/DataSet.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/xmldata/GenericData.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsDimension.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsValue.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Observation.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Series.java diff --git a/pom.xml b/pom.xml index b3c1148..ec49afd 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,23 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-validation + + + com.h2database + h2 + runtime + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java b/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java new file mode 100644 index 0000000..5a87861 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java @@ -0,0 +1,17 @@ +package com.crewmeister.cmcodingchallenge; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().add(new MappingJackson2XmlHttpMessageConverter()); + return restTemplate; + } +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java b/src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java new file mode 100644 index 0000000..4a1c8b4 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java @@ -0,0 +1,33 @@ +package com.crewmeister.cmcodingchallenge.currency; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.validation.constraints.NotBlank; + +@Entity +public class Currency { + + @Id + @GeneratedValue + private Long currencyId; + + @NotBlank(message = "Currency name must not be blank") + private String currencyName; + + public Long getCurrencyId() { + return currencyId; + } + + public void setCurrencyId(Long currencyId) { + this.currencyId = currencyId; + } + + public String getCurrencyName() { + return currencyName; + } + + public void setCurrencyName(String currencyName) { + this.currencyName = currencyName; + } +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyConstants.java b/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyConstants.java new file mode 100644 index 0000000..fdfcb70 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyConstants.java @@ -0,0 +1,47 @@ +package com.crewmeister.cmcodingchallenge.currency; + +public enum CurrencyConstants { + AUD, + BGN, + BRL, + CAD, + CHF, + CNY, + CYP, + CZK, + DKK, + EEK, + GBP, + GRD, + HKD, + HRK, + HUF, + IDR, + ILS, + INR, + ISK, + JPY, + KRW, + LTL, + LVL, + MTL, + MXN, + MYR, + NOK, + NZD, + PHP, + PLN, + ROL, + RON, + RUB, + SEK, + SGD, + SIT, + SKK, + THB, + TRL, + TRY, + USD, + ZAR + + } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyController.java b/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyController.java deleted file mode 100644 index d69be89..0000000 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyController.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.crewmeister.cmcodingchallenge.currency; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; - -@RestController() -@RequestMapping("/api") -public class CurrencyController { - - @GetMapping("/currencies") - public ResponseEntity> getCurrencies() { - ArrayList currencyConversionRates = new ArrayList(); - currencyConversionRates.add(new CurrencyConversionRates(2.5)); - - return new ResponseEntity>(currencyConversionRates, HttpStatus.OK); - } -} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyWrapper.java b/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyWrapper.java new file mode 100644 index 0000000..dbd3fb2 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currency/CurrencyWrapper.java @@ -0,0 +1,19 @@ +package com.crewmeister.cmcodingchallenge.currency; + +import javax.validation.Valid; +import java.util.List; + +public class CurrencyWrapper { + + @Valid + private List currencies; + + public List getCurrencies() { + return currencies; + } + + public void setCurrencies(List currencies) { + this.currencies = currencies; + } +} + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java new file mode 100644 index 0000000..84d5b88 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java @@ -0,0 +1,63 @@ +package com.crewmeister.cmcodingchallenge.currencycontroller; + +import com.crewmeister.cmcodingchallenge.currency.Currency; +import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; +import com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper; +import com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto; +import com.crewmeister.cmcodingchallenge.currencyservice.CurrencyService; +import com.crewmeister.cmcodingchallenge.exception.InvalidRequestException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController() +@RequestMapping("/api") +public class CurrencyController { + + @Autowired + CurrencyService currencyService; + + @PostMapping("/addCurrencies") + public List addCurrency(@RequestBody @Valid CurrencyWrapper currency) { + if (currency.getCurrencies() == null || currency.getCurrencies().isEmpty()) { + throw new IllegalArgumentException("Currency list must not be null or empty"); + } + return currencyService.addCurrency(currency.getCurrencies()); + } + + @GetMapping("/getAllAvailableCurrencies") + public ResponseEntity> getListOfAvailableCurrencies() { + List currencies = currencyService.getListOfAvailableCurrencies(); + List getCurrencyValues = new ArrayList<>(); + if(!currencies.isEmpty()) + getCurrencyValues =currencies.stream().map(x -> x.getCurrencyName()) + .collect(Collectors.toList()); + else { + for(CurrencyConstants ccy: CurrencyConstants.values()) + getCurrencyValues.add(ccy.name()); + } + return new ResponseEntity>(getCurrencyValues, HttpStatus.OK); + } + + @GetMapping("/getAllFXRates") + public ResponseEntity>> getAllFXRates(@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { + Map> fxRates = currencyService.getFXRates(date != null ? date.toString() : null); + + return new ResponseEntity>>(fxRates, HttpStatus.OK); + } + + @GetMapping("/getFXAmount") + public ResponseEntity getFXAmount(@Valid FXRequestDto request) { + double fxAmount = currencyService.getFXAmount(request.getDate().toString(),request.getCurrency().name(), request.getAmount()); + return new ResponseEntity(fxAmount, HttpStatus.OK); + } +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java new file mode 100644 index 0000000..ed51043 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java @@ -0,0 +1,45 @@ +package com.crewmeister.cmcodingchallenge.currencydto; + +import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import java.time.LocalDate; + +public class FXRequestDto { + + @NotNull(message = "Date is required") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate date; + + @NotNull(message = "Currency is required") + private CurrencyConstants currency; + + @Positive(message = "Amount must be a positive number") + private double amount; + + public LocalDate getDate() { + return date; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public CurrencyConstants getCurrency() { + return currency; + } + + public void setCurrency(CurrencyConstants currency) { + this.currency = currency; + } + + public double getAmount() { + return amount; + } + + public void setAmount(double amount) { + this.amount = amount; + } +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java new file mode 100644 index 0000000..310e510 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java @@ -0,0 +1,9 @@ +package com.crewmeister.cmcodingchallenge.currencyrepository; + + +import com.crewmeister.cmcodingchallenge.currency.Currency; +import org.springframework.data.jpa.repository.JpaRepository; + + +public interface CurrencyRepository extends JpaRepository { +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java new file mode 100644 index 0000000..a0db87a --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java @@ -0,0 +1,18 @@ +package com.crewmeister.cmcodingchallenge.currencyservice; + +import com.crewmeister.cmcodingchallenge.currency.Currency; + +import java.util.List; +import java.util.Map; + + +public interface CurrencyService { + + public List getListOfAvailableCurrencies(); + + public List addCurrency(List currency); + + public Map> getFXRates(String date); + + public double getFXAmount(String date, String currency, double amount); +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java new file mode 100644 index 0000000..1bc6c9f --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java @@ -0,0 +1,129 @@ +package com.crewmeister.cmcodingchallenge.currencyservice; + +import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; +import com.crewmeister.cmcodingchallenge.currency.CurrencyConversionRates; +import com.crewmeister.cmcodingchallenge.xmldata.GenericData; +import com.crewmeister.cmcodingchallenge.currency.Currency; +import com.crewmeister.cmcodingchallenge.currencyrepository.CurrencyRepository; +import com.crewmeister.cmcodingchallenge.xmldata.Observation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class CurrencyServiceImpl implements CurrencyService { + + + private final RestTemplate restTemplate; + + @Value("${bundesbank.api.base.url}") + private String bundesBaseUrl; + + @Value("${bundesbank.api.key}") + private String bundesApiKey; + + @Value("${bundesbank.api.format}") + private String bundesApiFormat; + + @Value("${bundesbank.api.lang}") + private String bundesApiLang; + + + public CurrencyServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + @Autowired + CurrencyRepository currencyRepository; + + @Override + public List getListOfAvailableCurrencies() { + return currencyRepository.findAll(); + } + + @Override + public List addCurrency(List currency) { + return currencyRepository.saveAll(currency); + } + + @Override + public Map> getFXRates(String date) { + List currencies = currencyRepository.findAll(); //Assuming DB has values; if not insert values from controller + Map> fxMapResult = new HashMap<>(); + for(Currency fxcurrency: currencies) { + System.out.println(fxcurrency.getCurrencyName()); + String url = buildUrl(bundesBaseUrl,bundesApiKey,bundesApiFormat,bundesApiLang); + url=url.replace("XXX",fxcurrency.getCurrencyName()); + System.out.println("URL is "+url); + ResponseEntity response = restTemplate.getForEntity(url, GenericData.class); + GenericData genericData = response.getBody(); + Map fxMap = new HashMap<>(); + + + for (Observation obs : genericData.dataSet.series.observations) { + if (date == null) { + if (obs.value == null) + continue; + fxMap.put(obs.dimension.date, obs.value.rate); + } else { + if (obs.dimension.date.equals(date) && obs.value != null) { + fxMap.put(obs.dimension.date, obs.value.rate); + break; + } + else if (obs.dimension.date.equals(date) && obs.value == null) { + fxMap.put(date, "Rate cannot be fetched as it is weekend or public holiday"); + break; + } + } + } + fxMapResult.put(fxcurrency.getCurrencyName(), fxMap); + } + + return fxMapResult; + } + + @Override + public double getFXAmount(String date, String currency, double amount) { + + System.out.println(currency); + CurrencyConversionRates ccr = null; + UriComponentsBuilder queryParams = UriComponentsBuilder.newInstance(); + queryParams.queryParam("format","sdmx"); + queryParams.queryParam("lang","en"); + String url = buildUrl(bundesBaseUrl,bundesApiKey,bundesApiFormat,bundesApiLang); + url=url.replace("XXX",currency); + System.out.println("URL is "+url); + ResponseEntity response = restTemplate.getForEntity(url, GenericData.class); + GenericData genericData = response.getBody(); + + for (Observation obs : genericData.dataSet.series.observations) { + if (obs.dimension.date.equals(date) && obs.value != null) { + ccr = new CurrencyConversionRates(Double.parseDouble(obs.value.rate)); + break; + } + } + System.out.println(ccr.getConversionRate()); + double exchangedAmount = amount/ccr.getConversionRate() ; + + return exchangedAmount; + } + + private String buildUrl(String baseUrl, String pathSegment, String format, String lang) { + return UriComponentsBuilder + .fromHttpUrl(baseUrl.endsWith("/") ? baseUrl : baseUrl + "/") + .path(pathSegment.startsWith("/") ? pathSegment.substring(1) : pathSegment) + .queryParam("format", format) + .queryParam("lang", lang) + .build() + .toUriString(); + } + + +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..77aeb3f --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java @@ -0,0 +1,69 @@ +package com.crewmeister.cmcodingchallenge.exception; + +import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +import java.time.LocalDate; +import java.util.HashMap; +import java.util.Map; + +@ControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleValidationErrors(MethodArgumentNotValidException ex) { + Map errors = new HashMap<>(); + + ex.getBindingResult().getFieldErrors().forEach(error -> + errors.put(error.getField(), error.getDefaultMessage()) + ); + + return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResponseEntity handleInvalidInput(HttpMessageNotReadableException ex) { + Map response = new HashMap<>(); + response.put("status", HttpStatus.BAD_REQUEST.value()); + response.put("error", "Invalid json input"); + response.put("message", "Json input is not structured"); + return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(MissingServletRequestParameterException.class) + public ResponseEntity handleMissingParams(MissingServletRequestParameterException ex) { + return ResponseEntity.badRequest().body( + Map.of("error", "Missing required parameter: " + ex.getParameterName()) + ); + } + + @ExceptionHandler(InvalidRequestException.class) + public ResponseEntity handleInvalidRequest(InvalidRequestException ex) { + return ResponseEntity + .badRequest() + .body(Map.of("error", ex.getMessage())); + } + + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMismatchException ex) { + if (ex.getRequiredType() == CurrencyConstants.class) { + return ResponseEntity.badRequest() + .body(Map.of("error", "Invalid currency as allowed values are not valid currencies")); + } + + if (ex.getRequiredType() == LocalDate.class) { + return ResponseEntity.badRequest() + .body(Map.of("error", "Date must be in format yyyy-MM-dd")); + } + + return ResponseEntity.badRequest() + .body(Map.of("error", "Invalid parameter: " + ex.getName())); + } +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/exception/InvalidRequestException.java b/src/main/java/com/crewmeister/cmcodingchallenge/exception/InvalidRequestException.java new file mode 100644 index 0000000..312a39a --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/exception/InvalidRequestException.java @@ -0,0 +1,8 @@ +package com.crewmeister.cmcodingchallenge.exception; + +public class InvalidRequestException extends RuntimeException { + public InvalidRequestException(String message) { + super(message); + } +} + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/DataSet.java b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/DataSet.java new file mode 100644 index 0000000..2a4f93e --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/DataSet.java @@ -0,0 +1,9 @@ +package com.crewmeister.cmcodingchallenge.xmldata; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +public class DataSet { + + @JacksonXmlProperty(localName = "Series", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic") + public Series series; +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/GenericData.java b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/GenericData.java new file mode 100644 index 0000000..c82705f --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/GenericData.java @@ -0,0 +1,13 @@ +package com.crewmeister.cmcodingchallenge.xmldata; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; + +@JacksonXmlRootElement(localName = "GenericData", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message") +public class GenericData { + + @JacksonXmlProperty(localName = "DataSet", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message") + public DataSet dataSet; +} + + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsDimension.java b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsDimension.java new file mode 100644 index 0000000..5c5f030 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsDimension.java @@ -0,0 +1,8 @@ +package com.crewmeister.cmcodingchallenge.xmldata; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +public class ObsDimension { + @JacksonXmlProperty(isAttribute = true, localName = "value") + public String date; +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsValue.java b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsValue.java new file mode 100644 index 0000000..45831b3 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/ObsValue.java @@ -0,0 +1,8 @@ +package com.crewmeister.cmcodingchallenge.xmldata; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +public class ObsValue { + @JacksonXmlProperty(isAttribute = true, localName = "value") + public String rate; +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Observation.java b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Observation.java new file mode 100644 index 0000000..ec206fa --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Observation.java @@ -0,0 +1,12 @@ +package com.crewmeister.cmcodingchallenge.xmldata; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +public class Observation { + + @JacksonXmlProperty(localName = "ObsDimension", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic") + public ObsDimension dimension; + + @JacksonXmlProperty(localName = "ObsValue", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic") + public ObsValue value; +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Series.java b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Series.java new file mode 100644 index 0000000..e599836 --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/xmldata/Series.java @@ -0,0 +1,13 @@ +package com.crewmeister.cmcodingchallenge.xmldata; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +public class Series { + + @JacksonXmlElementWrapper(useWrapping = false) + @JacksonXmlProperty(localName = "Obs", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic") + public List observations; +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..f42055a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,19 @@ +# H2 Database Configuration +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +# JPA / Hibernate +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=update + +# H2 Console +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console + +#BundesBank API URL +bundesbank.api.base.url=https://api.statistiken.bundesbank.de/rest/download/ +bundesbank.api.key=BBEX3/D.XXX.EUR.BB.AC.000 +bundesbank.api.format=sdmx +bundesbank.api.lang=en From a656ce51cfe2df182127a97af72631d8e13d7185 Mon Sep 17 00:00:00 2001 From: Karan Date: Tue, 20 May 2025 19:34:34 +0200 Subject: [PATCH 2/4] CM-Test - Implemented addtional features --- logDetails.log | 1632 +++++++++++++++++ pom.xml | 8 + .../CmCodingChallengeApplication.java | 2 + .../cmcodingchallenge/RestTemplateConfig.java | 13 +- .../CurrencyController.java | 15 +- .../currencydto/FXRequestDto.java | 3 +- .../CurrencyRepository.java | 7 + .../currencyservice/CurrencyService.java | 2 +- .../currencyservice/CurrencyServiceImpl.java | 100 +- .../exception/GlobalExceptionHandler.java | 52 +- src/main/resources/application.properties | 12 +- 11 files changed, 1796 insertions(+), 50 deletions(-) create mode 100644 logDetails.log diff --git a/logDetails.log b/logDetails.log new file mode 100644 index 0000000..a10179c --- /dev/null +++ b/logDetails.log @@ -0,0 +1,1632 @@ +2025-05-20 16:07:06.867 INFO 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 14472 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 16:07:06.882 DEBUG 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 16:07:06.882 INFO 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 16:07:06.960 INFO 14472 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 16:07:06.960 INFO 14472 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 16:07:08.113 INFO 14472 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 16:07:08.207 INFO 14472 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 75 ms. Found 1 JPA repository interfaces. +2025-05-20 16:07:09.441 INFO 14472 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 16:07:09.472 INFO 14472 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 16:07:09.472 INFO 14472 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 16:07:09.628 INFO 14472 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 16:07:09.628 INFO 14472 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2668 ms +2025-05-20 16:07:09.706 INFO 14472 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 16:07:09.863 INFO 14472 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 16:07:09.878 INFO 14472 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 16:07:10.035 INFO 14472 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 16:07:10.128 INFO 14472 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 16:07:10.347 INFO 14472 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 16:07:10.519 INFO 14472 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 16:07:11.534 INFO 14472 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 16:07:11.550 INFO 14472 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 16:07:11.566 INFO 14472 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 16:07:12.269 WARN 14472 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 16:07:12.425 INFO 14472 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 16:07:12.753 INFO 14472 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 16:07:12.769 INFO 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.643 seconds (JVM running for 7.432) +2025-05-20 16:08:00.673 INFO 14472 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 16:08:00.681 INFO 14472 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 16:08:00.690 INFO 14472 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 7 ms +2025-05-20 16:08:00.831 INFO 14472 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@35099f8b +2025-05-20 17:21:02.398 INFO 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 5180 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 17:21:02.404 DEBUG 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 17:21:02.405 INFO 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 17:21:02.702 INFO 5180 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 17:21:02.703 INFO 5180 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 17:21:04.017 INFO 5180 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 17:21:04.118 INFO 5180 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 84 ms. Found 1 JPA repository interfaces. +2025-05-20 17:21:04.570 INFO 5180 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$5e6cd9d6] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 17:21:05.358 INFO 5180 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 17:21:05.376 INFO 5180 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 17:21:05.377 INFO 5180 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 17:21:05.513 INFO 5180 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 17:21:05.514 INFO 5180 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2809 ms +2025-05-20 17:21:05.593 INFO 5180 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 17:21:05.837 INFO 5180 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 17:21:05.847 INFO 5180 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 17:21:06.015 INFO 5180 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 17:21:06.121 INFO 5180 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 17:21:06.377 INFO 5180 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 17:21:06.561 INFO 5180 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 17:21:07.597 INFO 5180 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 17:21:07.611 INFO 5180 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 17:21:07.642 INFO 5180 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 17:21:08.328 WARN 5180 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 17:21:08.538 INFO 5180 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 17:21:08.962 INFO 5180 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 17:21:08.980 INFO 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.394 seconds (JVM running for 8.376) +2025-05-20 17:21:37.138 INFO 5180 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 17:21:37.139 INFO 5180 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 17:21:37.141 INFO 5180 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2025-05-20 17:21:37.440 INFO 5180 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 17:21:37.454 ERROR 5180 --- [http-nio-8080-exec-1] c.c.c.exception.GlobalExceptionHandler : Validation failed + +java.lang.IllegalArgumentException: Currency list must not be null or empty + at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.addCurrency(CurrencyController.java:35) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:21:37.503 WARN 5180 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.IllegalArgumentException: Currency list must not be null or empty] +2025-05-20 17:23:25.129 INFO 5180 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 17:23:34.616 INFO 5180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-20 17:25:27.691 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 17:25:27.702 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 17:25:27.723 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:25:29.589 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH +2025-05-20 17:25:29.590 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:25:29.626 ERROR 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] +2025-05-20 17:25:29.645 ERROR 5180 --- [http-nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Unable to retrieve FX rate data. Please try again later.] with root cause + +java.lang.RuntimeException: Unable to retrieve FX rate data. Please try again later. + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.fetchRates(CurrencyServiceImpl.java:150) ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:70) ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$8e9f7efe.getFXRates() ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:33:19.429 INFO 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 14224 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 17:33:19.433 DEBUG 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 17:33:19.434 INFO 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 17:33:19.551 INFO 14224 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 17:33:19.552 INFO 14224 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 17:33:20.689 INFO 14224 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 17:33:20.805 INFO 14224 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 100 ms. Found 1 JPA repository interfaces. +2025-05-20 17:33:21.286 INFO 14224 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$d3ebbb69] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 17:33:22.055 INFO 14224 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 17:33:22.072 INFO 14224 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 17:33:22.072 INFO 14224 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 17:33:22.191 INFO 14224 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 17:33:22.192 INFO 14224 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2636 ms +2025-05-20 17:33:22.260 INFO 14224 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 17:33:22.465 INFO 14224 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 17:33:22.477 INFO 14224 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 17:33:22.642 INFO 14224 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 17:33:22.767 INFO 14224 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 17:33:23.027 INFO 14224 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 17:33:23.224 INFO 14224 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 17:33:24.277 INFO 14224 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 17:33:24.290 INFO 14224 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 17:33:24.332 INFO 14224 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 17:33:24.834 WARN 14224 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 17:33:24.997 INFO 14224 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 17:33:25.356 INFO 14224 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 17:33:25.372 INFO 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.724 seconds (JVM running for 7.736) +2025-05-20 17:33:35.484 INFO 14224 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 17:33:35.485 INFO 14224 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 17:33:35.487 INFO 14224 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2025-05-20 17:33:35.823 INFO 14224 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 17:33:42.689 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 17:33:42.974 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 17:33:42.986 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:33:44.570 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH +2025-05-20 17:33:44.571 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:33:44.616 ERROR 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] +2025-05-20 17:33:44.629 WARN 14224 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.crewmeister.cmcodingchallenge.exception.InvalidRequestException: Unable to retrieve FX rate data. Please try again later.] +2025-05-20 17:36:13.868 INFO 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12088 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 17:36:13.874 DEBUG 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 17:36:13.875 INFO 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 17:36:13.989 INFO 12088 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 17:36:13.991 INFO 12088 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 17:36:15.443 INFO 12088 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 17:36:15.564 INFO 12088 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 100 ms. Found 1 JPA repository interfaces. +2025-05-20 17:36:16.026 INFO 12088 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$437e0c] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 17:36:16.844 INFO 12088 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 17:36:16.861 INFO 12088 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 17:36:16.862 INFO 12088 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 17:36:17.002 INFO 12088 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 17:36:17.003 INFO 12088 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3010 ms +2025-05-20 17:36:17.099 INFO 12088 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 17:36:17.302 INFO 12088 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 17:36:17.315 INFO 12088 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 17:36:17.518 INFO 12088 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 17:36:17.628 INFO 12088 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 17:36:17.931 INFO 12088 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 17:36:18.142 INFO 12088 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 17:36:19.252 INFO 12088 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 17:36:19.266 INFO 12088 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 17:36:19.296 INFO 12088 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 17:36:19.838 WARN 12088 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 17:36:20.008 INFO 12088 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 17:36:20.364 INFO 12088 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 17:36:20.380 INFO 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.319 seconds (JVM running for 8.076) +2025-05-20 17:36:27.392 INFO 12088 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 17:36:27.393 INFO 12088 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 17:36:27.397 INFO 12088 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-05-20 17:36:27.844 INFO 12088 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 17:36:31.506 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 17:36:31.691 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 17:36:31.703 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:33.133 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH +2025-05-20 17:36:33.134 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:33.168 ERROR 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] +2025-05-20 17:36:33.183 WARN 12088 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.crewmeister.cmcodingchallenge.exception.InvalidRequestException: Unable to retrieve FX rate data. Please try again later.] +2025-05-20 17:36:47.470 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 17:36:47.479 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 17:36:47.481 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:48.190 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH +2025-05-20 17:36:48.191 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:48.263 ERROR 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] +2025-05-20 17:36:48.265 WARN 12088 --- [http-nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.crewmeister.cmcodingchallenge.exception.InvalidRequestException: Unable to retrieve FX rate data. Please try again later.] +2025-05-20 17:36:54.180 INFO 12088 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 17:36:57.481 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 17:36:57.488 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 17:36:57.491 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:58.004 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-20 17:36:58.005 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:58.534 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-20 17:36:58.535 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:59.091 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-20 17:36:59.092 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:36:59.782 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-20 17:36:59.783 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:00.535 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-20 17:37:00.536 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:01.158 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-20 17:37:01.159 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:01.533 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-20 17:37:01.534 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:02.822 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-20 17:37:02.824 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:03.507 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-20 17:37:03.508 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:03.773 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-20 17:37:03.774 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:04.347 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-20 17:37:04.348 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:04.523 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-20 17:37:04.523 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:05.126 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-20 17:37:05.127 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:05.660 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-20 17:37:05.662 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:06.413 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-20 17:37:06.414 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:07.182 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-20 17:37:07.183 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:07.831 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 17:37:07.832 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:08.526 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-20 17:37:08.527 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:09.041 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-20 17:37:09.042 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:09.704 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-20 17:37:09.704 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:10.375 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-20 17:37:10.376 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:10.839 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-20 17:37:10.840 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:11.255 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-20 17:37:11.256 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:11.574 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-20 17:37:11.575 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:12.247 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-20 17:37:12.248 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:12.952 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-20 17:37:12.953 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:13.640 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-20 17:37:13.642 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:14.193 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-20 17:37:14.196 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:14.759 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-20 17:37:14.760 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:15.464 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-20 17:37:15.465 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:15.639 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-20 17:37:15.640 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:16.101 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-20 17:37:16.102 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:16.654 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-20 17:37:16.655 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:17.234 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-20 17:37:17.235 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:17.892 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-20 17:37:17.893 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:18.096 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-20 17:37:18.098 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:18.429 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-20 17:37:18.430 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:18.997 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-20 17:37:18.999 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:19.183 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-20 17:37:19.185 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:19.726 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-20 17:37:19.727 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:20.400 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-20 17:37:20.401 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:37:52.917 WARN 12088 --- [http-nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.crewmeister.cmcodingchallenge.exception.GlobalExceptionHandler#handleIllegalArguments(IllegalArgumentException) + +java.lang.IllegalStateException: Could not resolve parameter [0] in public org.springframework.http.ResponseEntity com.crewmeister.cmcodingchallenge.exception.GlobalExceptionHandler.handleIllegalArguments(java.lang.IllegalArgumentException): No suitable resolver + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:420) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:75) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1321) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1132) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:37:52.948 WARN 12088 --- [http-nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] +2025-05-20 17:47:23.996 INFO 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 11788 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 17:47:24.001 DEBUG 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 17:47:24.002 INFO 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 17:47:24.112 INFO 11788 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 17:47:24.115 INFO 11788 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 17:47:25.251 INFO 11788 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 17:47:25.346 INFO 11788 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 81 ms. Found 1 JPA repository interfaces. +2025-05-20 17:47:25.768 INFO 11788 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$3bc152e2] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 17:47:26.566 INFO 11788 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 17:47:26.585 INFO 11788 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 17:47:26.586 INFO 11788 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 17:47:26.718 INFO 11788 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 17:47:26.719 INFO 11788 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2601 ms +2025-05-20 17:47:26.794 INFO 11788 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 17:47:26.987 INFO 11788 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 17:47:26.996 INFO 11788 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 17:47:27.161 INFO 11788 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 17:47:27.248 INFO 11788 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 17:47:27.555 INFO 11788 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 17:47:27.782 INFO 11788 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 17:47:28.893 INFO 11788 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 17:47:28.910 INFO 11788 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 17:47:28.938 INFO 11788 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 17:47:29.587 WARN 11788 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 17:47:29.744 INFO 11788 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 17:47:30.295 INFO 11788 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 17:47:30.312 INFO 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.095 seconds (JVM running for 7.949) +2025-05-20 17:47:35.257 INFO 11788 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 17:47:35.259 INFO 11788 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 17:47:35.262 INFO 11788 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-05-20 17:47:35.405 WARN 11788 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] +2025-05-20 17:48:03.874 WARN 11788 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-12-2'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-12-2]] +2025-05-20 17:48:23.247 WARN 11788 --- [http-nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value 'ahd'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [ahd]] +2025-05-20 17:48:53.765 INFO 11788 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 17:49:00.056 INFO 11788 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 17:49:02.941 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 17:49:02.972 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 17:49:02.995 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:04.643 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-20 17:49:04.644 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:05.304 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-20 17:49:05.305 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:05.926 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-20 17:49:05.927 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:06.684 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-20 17:49:06.684 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:07.353 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-20 17:49:07.354 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:08.981 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-20 17:49:08.985 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:09.439 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-20 17:49:09.441 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:10.339 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-20 17:49:10.341 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:10.991 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-20 17:49:11.114 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:11.518 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-20 17:49:11.519 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:12.136 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-20 17:49:12.137 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:12.328 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-20 17:49:12.328 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:12.989 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-20 17:49:12.990 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:13.480 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-20 17:49:13.481 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:14.191 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-20 17:49:14.191 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:14.810 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-20 17:49:14.811 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:15.515 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 17:49:15.515 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:16.293 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-20 17:49:16.293 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:16.833 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-20 17:49:16.834 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:17.477 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-20 17:49:17.477 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:18.193 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-20 17:49:18.194 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:18.799 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-20 17:49:18.800 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:19.336 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-20 17:49:19.337 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:19.638 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-20 17:49:19.639 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:20.469 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-20 17:49:20.469 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:21.163 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-20 17:49:21.164 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:21.872 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-20 17:49:21.873 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:22.536 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-20 17:49:22.537 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:23.204 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-20 17:49:23.205 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:24.121 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-20 17:49:24.122 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:24.321 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-20 17:49:24.321 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:25.070 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-20 17:49:25.072 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:25.602 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-20 17:49:25.603 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:26.215 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-20 17:49:26.217 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:26.808 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-20 17:49:26.809 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:27.177 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-20 17:49:27.177 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:27.619 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-20 17:49:27.620 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:28.266 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-20 17:49:28.267 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:28.482 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-20 17:49:28.483 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:28.967 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-20 17:49:28.969 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:49:29.783 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-20 17:49:29.784 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:50:14.999 ERROR 11788 --- [http-nio-8080-exec-7] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [olk]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'olk'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.olk] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:50:15.006 WARN 11788 --- [http-nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [olk]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'olk'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.olk]] +2025-05-20 17:50:49.865 ERROR 11788 --- [http-nio-8080-exec-8] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-9.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:50:49.868 WARN 11788 --- [http-nio-8080-exec-8] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-9.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number]] +2025-05-20 17:50:56.601 ERROR 11788 --- [http-nio-8080-exec-9] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:50:56.609 WARN 11788 --- [http-nio-8080-exec-9] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null]] +2025-05-20 17:51:14.823 ERROR 11788 --- [http-nio-8080-exec-10] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:51:14.826 WARN 11788 --- [http-nio-8080-exec-10] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]]] +2025-05-20 17:52:17.942 ERROR 11788 --- [http-nio-8080-exec-1] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 17:52:17.948 WARN 11788 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]]] +2025-05-20 17:52:45.757 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@33ec4a29 +2025-05-20 17:52:45.780 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 17:52:45.785 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 17:52:46.645 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Conversion rate for INR on 2025-05-19 is 96.2175 +2025-05-20 18:48:42.537 INFO 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 15064 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 18:48:42.542 DEBUG 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 18:48:42.542 INFO 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 18:48:42.650 INFO 15064 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 18:48:42.651 INFO 15064 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 18:48:43.786 INFO 15064 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 18:48:43.887 INFO 15064 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 86 ms. Found 1 JPA repository interfaces. +2025-05-20 18:48:44.317 INFO 15064 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$7e69a3bd] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 18:48:45.088 INFO 15064 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 18:48:45.106 INFO 15064 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 18:48:45.106 INFO 15064 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 18:48:45.231 INFO 15064 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 18:48:45.232 INFO 15064 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2579 ms +2025-05-20 18:48:45.320 INFO 15064 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 18:48:45.518 INFO 15064 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 18:48:45.528 INFO 15064 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 18:48:45.698 INFO 15064 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 18:48:45.793 INFO 15064 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 18:48:46.002 INFO 15064 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 18:48:46.196 INFO 15064 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 18:48:47.242 INFO 15064 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 18:48:47.256 INFO 15064 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 18:48:47.284 INFO 15064 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 18:48:48.001 WARN 15064 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 18:48:48.177 INFO 15064 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 18:48:48.594 INFO 15064 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 18:48:48.612 INFO 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.277 seconds (JVM running for 8.058) +2025-05-20 18:49:04.262 INFO 15064 --- [http-nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 18:49:04.264 INFO 15064 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 18:49:04.266 INFO 15064 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-20 18:49:04.398 ERROR 15064 --- [http-nio-8080-exec-2] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 18:49:04.455 WARN 15064 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS]] +2025-05-20 18:50:57.344 INFO 15064 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 18:50:57.389 ERROR 15064 --- [http-nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause + +java.lang.NullPointerException: null + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:67) ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$40a57405.getFXRates() ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 18:51:34.808 INFO 15064 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 18:51:34.814 ERROR 15064 --- [http-nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause + +java.lang.NullPointerException: null + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:67) ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$40a57405.getFXRates() ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 19:02:57.027 INFO 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 888 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 19:02:57.032 DEBUG 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 19:02:57.033 INFO 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 19:02:57.168 INFO 888 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 19:02:57.170 INFO 888 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 19:02:58.302 INFO 888 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 19:02:58.399 INFO 888 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 82 ms. Found 1 JPA repository interfaces. +2025-05-20 19:02:58.834 INFO 888 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$56ab939] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 19:02:59.641 INFO 888 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 19:02:59.663 INFO 888 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 19:02:59.664 INFO 888 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 19:02:59.794 INFO 888 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 19:02:59.795 INFO 888 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2623 ms +2025-05-20 19:02:59.873 INFO 888 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 19:03:00.210 INFO 888 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 19:03:00.222 INFO 888 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 19:03:00.437 INFO 888 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 19:03:00.540 INFO 888 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 19:03:00.828 INFO 888 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 19:03:01.023 INFO 888 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 19:03:02.109 INFO 888 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 19:03:02.126 INFO 888 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 19:03:02.176 INFO 888 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 19:03:03.007 WARN 888 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 19:03:03.179 INFO 888 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 19:03:03.566 INFO 888 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 19:03:03.587 INFO 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.326 seconds (JVM running for 8.173) +2025-05-20 19:03:12.790 INFO 888 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 19:03:12.791 INFO 888 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 19:03:12.794 INFO 888 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-20 19:03:12.862 INFO 888 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:03:35.865 INFO 888 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 19:03:39.182 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:03:39.217 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 19:03:39.280 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:41.093 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-20 19:03:41.094 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:41.755 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-20 19:03:41.756 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:42.305 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-20 19:03:42.306 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:43.212 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-20 19:03:43.213 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:43.888 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-20 19:03:43.889 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:44.532 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-20 19:03:44.533 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:44.836 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-20 19:03:44.837 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:45.489 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-20 19:03:45.490 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:46.204 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-20 19:03:46.205 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:46.660 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-20 19:03:46.685 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:47.834 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-20 19:03:47.835 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:48.134 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-20 19:03:48.137 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:49.219 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-20 19:03:49.220 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:49.872 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-20 19:03:49.873 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:50.629 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-20 19:03:50.630 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:51.321 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-20 19:03:51.322 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:51.965 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 19:03:51.966 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:52.716 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-20 19:03:52.717 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:53.282 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-20 19:03:53.283 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:53.930 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-20 19:03:53.931 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:54.925 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-20 19:03:54.926 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:55.420 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-20 19:03:55.421 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:55.825 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-20 19:03:55.826 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:56.500 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-20 19:03:56.504 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:58.236 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-20 19:03:58.238 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:03:59.626 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-20 19:03:59.630 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:00.683 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-20 19:04:00.776 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:03.038 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-20 19:04:03.039 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:04.845 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-20 19:04:04.846 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:06.094 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-20 19:04:06.095 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:06.308 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-20 19:04:06.310 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:06.912 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-20 19:04:06.914 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:07.780 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-20 19:04:07.781 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:08.411 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-20 19:04:08.412 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:09.079 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-20 19:04:09.080 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:09.516 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-20 19:04:09.517 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:09.883 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-20 19:04:09.885 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:10.542 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-20 19:04:10.543 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:10.731 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-20 19:04:10.732 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:11.193 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-20 19:04:11.194 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:04:11.749 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-20 19:04:11.750 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:06:51.603 INFO 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 4704 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 19:06:51.608 DEBUG 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 19:06:51.609 INFO 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 19:06:51.721 INFO 4704 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 19:06:51.722 INFO 4704 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 19:06:53.978 INFO 4704 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 19:06:54.088 INFO 4704 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 95 ms. Found 1 JPA repository interfaces. +2025-05-20 19:06:54.628 INFO 4704 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$9c5cad06] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 19:06:55.461 INFO 4704 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 19:06:55.476 INFO 4704 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 19:06:55.477 INFO 4704 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 19:06:55.590 INFO 4704 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 19:06:55.592 INFO 4704 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3867 ms +2025-05-20 19:06:55.658 INFO 4704 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 19:06:55.827 INFO 4704 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 19:06:55.836 INFO 4704 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 19:06:55.985 INFO 4704 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 19:06:56.098 INFO 4704 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 19:06:56.353 INFO 4704 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 19:06:56.521 INFO 4704 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 19:06:57.457 INFO 4704 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 19:06:57.472 INFO 4704 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 19:06:57.497 INFO 4704 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 19:06:58.391 WARN 4704 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 19:06:58.582 INFO 4704 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 19:06:58.911 INFO 4704 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 19:06:58.928 INFO 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 8.235 seconds (JVM running for 9.216) +2025-05-20 19:07:03.607 INFO 4704 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 19:07:03.609 INFO 4704 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 19:07:03.612 INFO 4704 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-05-20 19:07:03.676 INFO 4704 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:07:19.166 INFO 4704 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:07:30.943 INFO 4704 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:07:30.995 ERROR 4704 --- [http-nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Invalid Currency Name] with root cause + +java.lang.RuntimeException: Invalid Currency Name + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:74) ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$5baa5f9f.getFXRates() ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 19:07:55.537 INFO 4704 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 19:07:59.649 INFO 4704 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:07:59.660 ERROR 4704 --- [http-nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Invalid Currency Name] with root cause + +java.lang.RuntimeException: Invalid Currency Name + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:74) ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$5baa5f9f.getFXRates() ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 19:08:17.169 INFO 4704 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:08:17.180 ERROR 4704 --- [http-nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class com.crewmeister.cmcodingchallenge.currency.Currency ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.crewmeister.cmcodingchallenge.currency.Currency is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @48ed5919)] with root cause + +java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class com.crewmeister.cmcodingchallenge.currency.Currency ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.crewmeister.cmcodingchallenge.currency.Currency is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @48ed5919) + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:72) ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$5baa5f9f.getFXRates() ~[classes/:na] + at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-20 19:12:14.064 INFO 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12416 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 19:12:14.067 DEBUG 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 19:12:14.068 INFO 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 19:12:14.173 INFO 12416 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 19:12:14.174 INFO 12416 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 19:12:15.374 INFO 12416 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 19:12:15.471 INFO 12416 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 82 ms. Found 1 JPA repository interfaces. +2025-05-20 19:12:15.904 INFO 12416 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$51d058dc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 19:12:16.650 INFO 12416 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 19:12:16.666 INFO 12416 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 19:12:16.667 INFO 12416 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 19:12:16.777 INFO 12416 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 19:12:16.777 INFO 12416 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2601 ms +2025-05-20 19:12:16.882 INFO 12416 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 19:12:17.059 INFO 12416 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 19:12:17.069 INFO 12416 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 19:12:17.232 INFO 12416 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 19:12:17.317 INFO 12416 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 19:12:17.541 INFO 12416 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 19:12:17.717 INFO 12416 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 19:12:18.796 INFO 12416 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 19:12:18.809 INFO 12416 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 19:12:18.836 INFO 12416 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 19:12:19.529 WARN 12416 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 19:12:19.689 INFO 12416 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 19:12:20.027 INFO 12416 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 19:12:20.042 INFO 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.746 seconds (JVM running for 7.583) +2025-05-20 19:12:25.195 INFO 12416 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 19:12:25.197 INFO 12416 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 19:12:25.199 INFO 12416 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-20 19:12:25.284 INFO 12416 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:12:25.406 WARN 12416 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name] +2025-05-20 19:12:37.084 INFO 12416 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 19:12:40.053 INFO 12416 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:12:40.090 INFO 12416 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 19:12:40.167 INFO 12416 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:09.810 INFO 12416 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:13:09.827 WARN 12416 --- [http-nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name] +2025-05-20 19:13:35.478 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:13:35.569 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 19:13:35.571 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:36.270 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-20 19:13:36.271 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:36.808 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-20 19:13:36.809 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:37.444 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-20 19:13:37.445 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:38.122 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-20 19:13:38.123 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:38.745 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-20 19:13:38.746 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:39.277 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-20 19:13:39.278 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:39.625 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-20 19:13:39.626 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:40.268 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-20 19:13:40.269 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:40.923 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-20 19:13:40.924 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:41.243 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-20 19:13:41.243 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:42.090 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-20 19:13:42.091 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:42.250 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-20 19:13:42.251 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:42.816 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-20 19:13:42.817 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:43.345 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-20 19:13:43.346 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:44.001 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-20 19:13:44.002 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:44.580 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-20 19:13:44.581 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:46.078 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 19:13:46.079 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:46.851 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-20 19:13:46.852 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:47.429 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-20 19:13:47.430 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:48.163 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-20 19:13:48.164 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:48.804 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-20 19:13:48.805 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:49.255 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-20 19:13:49.256 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:49.689 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-20 19:13:49.690 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:49.923 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-20 19:13:49.924 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:50.601 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-20 19:13:50.602 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:51.418 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-20 19:13:51.418 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:52.021 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-20 19:13:52.022 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:52.692 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-20 19:13:52.693 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:53.281 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-20 19:13:53.282 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:54.008 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-20 19:13:54.009 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:54.188 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-20 19:13:54.189 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:54.739 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-20 19:13:54.740 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:55.253 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-20 19:13:55.254 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:55.784 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-20 19:13:55.784 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:56.352 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-20 19:13:56.352 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:56.533 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-20 19:13:56.534 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:56.862 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-20 19:13:56.862 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:57.471 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-20 19:13:57.471 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:57.637 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-20 19:13:57.638 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:58.068 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-20 19:13:58.069 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:13:58.607 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-20 19:13:58.608 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:11.448 INFO 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 5508 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-20 19:19:11.452 DEBUG 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-20 19:19:11.453 INFO 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-20 19:19:11.543 INFO 5508 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-20 19:19:11.544 INFO 5508 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-20 19:19:12.819 INFO 5508 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-20 19:19:12.928 INFO 5508 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 94 ms. Found 1 JPA repository interfaces. +2025-05-20 19:19:13.357 INFO 5508 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$9c5cad06] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-20 19:19:14.128 INFO 5508 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-20 19:19:14.144 INFO 5508 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-20 19:19:14.145 INFO 5508 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-20 19:19:14.269 INFO 5508 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-20 19:19:14.270 INFO 5508 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2724 ms +2025-05-20 19:19:14.340 INFO 5508 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-20 19:19:14.523 INFO 5508 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-20 19:19:14.532 INFO 5508 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-20 19:19:14.695 INFO 5508 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-20 19:19:14.780 INFO 5508 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-20 19:19:15.013 INFO 5508 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-20 19:19:15.192 INFO 5508 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-20 19:19:16.136 INFO 5508 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-20 19:19:16.151 INFO 5508 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-20 19:19:16.178 INFO 5508 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-20 19:19:16.917 WARN 5508 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-20 19:19:17.100 INFO 5508 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-20 19:19:17.429 INFO 5508 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-20 19:19:17.444 INFO 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.711 seconds (JVM running for 7.784) +2025-05-20 19:19:29.873 INFO 5508 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-20 19:19:29.874 INFO 5508 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-20 19:19:29.876 INFO 5508 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-20 19:19:29.951 INFO 5508 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:19:34.302 INFO 5508 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-20 19:19:35.998 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:19:36.027 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-20 19:19:36.041 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:37.242 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-20 19:19:37.243 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:37.629 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-20 19:19:37.630 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:38.059 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-20 19:19:38.060 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:38.462 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-20 19:19:38.463 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:38.952 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-20 19:19:38.953 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:39.364 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-20 19:19:39.365 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:39.660 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-20 19:19:39.662 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:41.365 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-20 19:19:41.367 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:42.113 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-20 19:19:42.115 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:42.418 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-20 19:19:42.419 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:43.154 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-20 19:19:43.157 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:43.334 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-20 19:19:43.335 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:43.956 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-20 19:19:43.957 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:44.457 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-20 19:19:44.458 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:45.111 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-20 19:19:45.112 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:45.673 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-20 19:19:45.674 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:46.193 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 19:19:46.194 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:46.742 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-20 19:19:46.743 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:47.292 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-20 19:19:47.293 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:48.099 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-20 19:19:48.100 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:48.691 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-20 19:19:48.692 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:48.967 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-20 19:19:48.968 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:49.330 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-20 19:19:49.331 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:49.573 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-20 19:19:49.574 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:50.272 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-20 19:19:50.273 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:50.798 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-20 19:19:50.799 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:51.209 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-20 19:19:51.210 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:51.752 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-20 19:19:51.753 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:52.323 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-20 19:19:52.324 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:52.890 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-20 19:19:52.891 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:53.177 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-20 19:19:53.178 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:53.728 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-20 19:19:53.729 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:54.217 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-20 19:19:54.218 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:54.760 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-20 19:19:54.761 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:55.320 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-20 19:19:55.326 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:55.502 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-20 19:19:55.503 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:55.814 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-20 19:19:55.815 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:57.294 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-20 19:19:57.295 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:57.563 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-20 19:19:57.564 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:58.030 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-20 19:19:58.032 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:19:58.508 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-20 19:19:58.509 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:20:12.294 INFO 5508 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:20:12.330 INFO 5508 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-20 19:20:12.331 INFO 5508 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:20:16.578 INFO 5508 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:20:16.581 INFO 5508 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-20 19:20:16.582 INFO 5508 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-20 19:20:25.468 INFO 5508 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-20 19:20:25.480 WARN 5508 --- [http-nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name as validated from db] diff --git a/pom.xml b/pom.xml index ec49afd..ebff352 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,14 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml + + org.springframework.retry + spring-retry + + + org.springframework.boot + spring-boot-starter-aop + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplication.java b/src/main/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplication.java index 409a877..32f28d7 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplication.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.retry.annotation.EnableRetry; @SpringBootApplication +@EnableRetry public class CmCodingChallengeApplication { public static void main(String[] args) { diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java b/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java index 5a87861..3368ee6 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java @@ -1,16 +1,27 @@ package com.crewmeister.cmcodingchallenge; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { + @Value("${rest.template.connection.timeout}") + private int connectionTimeout; + + @Value("${rest.template.read.timeout}") + private int readTimeout; + @Bean public RestTemplate restTemplate() { - RestTemplate restTemplate = new RestTemplate(); + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(connectionTimeout); // in milliseconds + factory.setReadTimeout(readTimeout); + RestTemplate restTemplate = new RestTemplate(factory); restTemplate.getMessageConverters().add(new MappingJackson2XmlHttpMessageConverter()); return restTemplate; } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java index 84d5b88..597de48 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java @@ -5,13 +5,14 @@ import com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper; import com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto; import com.crewmeister.cmcodingchallenge.currencyservice.CurrencyService; -import com.crewmeister.cmcodingchallenge.exception.InvalidRequestException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.validation.Valid; import java.time.LocalDate; import java.util.ArrayList; @@ -23,11 +24,13 @@ @RequestMapping("/api") public class CurrencyController { + private static final Logger logger = LoggerFactory.getLogger(CurrencyController.class); @Autowired CurrencyService currencyService; @PostMapping("/addCurrencies") public List addCurrency(@RequestBody @Valid CurrencyWrapper currency) { + logger.info("Adding the list of Currency"); if (currency.getCurrencies() == null || currency.getCurrencies().isEmpty()) { throw new IllegalArgumentException("Currency list must not be null or empty"); } @@ -36,12 +39,13 @@ public List addCurrency(@RequestBody @Valid CurrencyWrapper currency) @GetMapping("/getAllAvailableCurrencies") public ResponseEntity> getListOfAvailableCurrencies() { + logger.info("Fetching the list of Currencies"); List currencies = currencyService.getListOfAvailableCurrencies(); List getCurrencyValues = new ArrayList<>(); if(!currencies.isEmpty()) getCurrencyValues =currencies.stream().map(x -> x.getCurrencyName()) .collect(Collectors.toList()); - else { + else { //if db doesnt have data , we have retrieved data from enum for(CurrencyConstants ccy: CurrencyConstants.values()) getCurrencyValues.add(ccy.name()); } @@ -49,14 +53,15 @@ public ResponseEntity> getListOfAvailableCurrencies() { } @GetMapping("/getAllFXRates") - public ResponseEntity>> getAllFXRates(@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { - Map> fxRates = currencyService.getFXRates(date != null ? date.toString() : null); - + public ResponseEntity>> getAllFXRates(@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date, @RequestParam(required = false) String currency) { + logger.info("Fetching the fx rates of Currencies"); + Map> fxRates = currencyService.getFXRates(date != null ? date.toString() : null,currency); return new ResponseEntity>>(fxRates, HttpStatus.OK); } @GetMapping("/getFXAmount") public ResponseEntity getFXAmount(@Valid FXRequestDto request) { + logger.info("Received FX request: {}", request); double fxAmount = currencyService.getFXAmount(request.getDate().toString(),request.getCurrency().name(), request.getAmount()); return new ResponseEntity(fxAmount, HttpStatus.OK); } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java index ed51043..d98401d 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencydto/FXRequestDto.java @@ -16,8 +16,9 @@ public class FXRequestDto { @NotNull(message = "Currency is required") private CurrencyConstants currency; + @NotNull @Positive(message = "Amount must be a positive number") - private double amount; + private Double amount; public LocalDate getDate() { return date; diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java index 310e510..fb37309 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyrepository/CurrencyRepository.java @@ -3,7 +3,14 @@ import com.crewmeister.cmcodingchallenge.currency.Currency; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; public interface CurrencyRepository extends JpaRepository { + + @Query("SELECT c FROM Currency c WHERE c.currencyName = :currency") + Optional findCurrencyName(@Param("currency") String currency); } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java index a0db87a..60af73b 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyService.java @@ -12,7 +12,7 @@ public interface CurrencyService { public List addCurrency(List currency); - public Map> getFXRates(String date); + public Map> getFXRates(String date,String currency); public double getFXAmount(String date, String currency, double amount); } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java index 1bc6c9f..b5e3b49 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java @@ -2,28 +2,36 @@ import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; import com.crewmeister.cmcodingchallenge.currency.CurrencyConversionRates; +import com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController; +import com.crewmeister.cmcodingchallenge.exception.InvalidRequestException; import com.crewmeister.cmcodingchallenge.xmldata.GenericData; import com.crewmeister.cmcodingchallenge.currency.Currency; import com.crewmeister.cmcodingchallenge.currencyrepository.CurrencyRepository; import com.crewmeister.cmcodingchallenge.xmldata.Observation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; +import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +import java.net.SocketTimeoutException; +import java.util.*; @Service public class CurrencyServiceImpl implements CurrencyService { - + private static final Logger logger = LoggerFactory.getLogger(CurrencyServiceImpl.class); private final RestTemplate restTemplate; + private static final int RETRY_ATTEMPTS = 3; + private static final long DELAY = 2000L; + @Value("${bundesbank.api.base.url}") private String bundesBaseUrl; @@ -54,16 +62,29 @@ public List addCurrency(List currency) { } @Override - public Map> getFXRates(String date) { - List currencies = currencyRepository.findAll(); //Assuming DB has values; if not insert values from controller + public Map> getFXRates(String date,String currency) { + List currencies = new ArrayList<>(); + if(currency==null || currency.isEmpty() ) + currencies= currencyRepository.findAll();//Assuming DB has values; if not insert values from controller + else { + Optional ccy = currencyRepository.findCurrencyName(currency); + if(ccy.isPresent()) + currencies.add(ccy.get()); + else{ + throw new RuntimeException("Invalid Currency Name as validated from db"); + } + + } Map> fxMapResult = new HashMap<>(); for(Currency fxcurrency: currencies) { - System.out.println(fxcurrency.getCurrencyName()); - String url = buildUrl(bundesBaseUrl,bundesApiKey,bundesApiFormat,bundesApiLang); - url=url.replace("XXX",fxcurrency.getCurrencyName()); - System.out.println("URL is "+url); - ResponseEntity response = restTemplate.getForEntity(url, GenericData.class); - GenericData genericData = response.getBody(); + logger.info("Processing currency: {}",fxcurrency.getCurrencyName()); + String url = buildUrl(fxcurrency.getCurrencyName()); + logger.info("Requesting FX data from URL: {} ", url); + GenericData genericData = fetchRates(url, fxcurrency.getCurrencyName()); + if (genericData == null || genericData.dataSet == null || genericData.dataSet.series == null) { + logger.warn("Received empty response for currency {}", fxcurrency.getCurrencyName()); + continue; + } Map fxMap = new HashMap<>(); @@ -92,38 +113,59 @@ else if (obs.dimension.date.equals(date) && obs.value == null) { @Override public double getFXAmount(String date, String currency, double amount) { - System.out.println(currency); + logger.info("Processing currency: {}",currency); CurrencyConversionRates ccr = null; - UriComponentsBuilder queryParams = UriComponentsBuilder.newInstance(); - queryParams.queryParam("format","sdmx"); - queryParams.queryParam("lang","en"); - String url = buildUrl(bundesBaseUrl,bundesApiKey,bundesApiFormat,bundesApiLang); - url=url.replace("XXX",currency); - System.out.println("URL is "+url); - ResponseEntity response = restTemplate.getForEntity(url, GenericData.class); - GenericData genericData = response.getBody(); - + String url = buildUrl(currency); + logger.info("Requesting FX data from URL: {} ", url); + GenericData genericData = fetchRates(url,currency); + if (genericData == null || genericData.dataSet == null || genericData.dataSet.series == null) { + logger.error("Received empty response for currency {}", currency); + throw new RuntimeException("Generic data is unavailable for currency: " + currency); + } for (Observation obs : genericData.dataSet.series.observations) { if (obs.dimension.date.equals(date) && obs.value != null) { ccr = new CurrencyConversionRates(Double.parseDouble(obs.value.rate)); break; } } - System.out.println(ccr.getConversionRate()); + + if (ccr == null) { + throw new IllegalArgumentException("Conversion rate not found for date " + date); + } + logger.info("Conversion rate for {} on {} is {}",currency,date,ccr.getConversionRate()); double exchangedAmount = amount/ccr.getConversionRate() ; return exchangedAmount; } - private String buildUrl(String baseUrl, String pathSegment, String format, String lang) { + private String buildUrl(String currencyName) { + String apiKey = String.format(bundesApiKey, currencyName); return UriComponentsBuilder - .fromHttpUrl(baseUrl.endsWith("/") ? baseUrl : baseUrl + "/") - .path(pathSegment.startsWith("/") ? pathSegment.substring(1) : pathSegment) - .queryParam("format", format) - .queryParam("lang", lang) + .fromHttpUrl(bundesBaseUrl.endsWith("/") ? bundesBaseUrl : bundesBaseUrl + "/") + .pathSegment(apiKey) + .queryParam("format", bundesApiFormat) + .queryParam("lang", bundesApiLang) .build() .toUriString(); } + @Retryable( + value = { ResourceAccessException.class, SocketTimeoutException.class }, + maxAttempts = RETRY_ATTEMPTS, + backoff = @Backoff(delay = DELAY) + ) + private GenericData fetchRates(String url,String currency) { + try { + var response = restTemplate.getForEntity(url, GenericData.class); + GenericData genericData = response.getBody(); + return genericData; + } + catch (Exception e) { + logger.error("Failed to fetch data from Bundesbank for currency {}: {}", currency, e.getMessage()); + throw new InvalidRequestException("Unable to retrieve FX rate data. Please try again later."); + } + + } + } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java index 77aeb3f..e5ba7a2 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java @@ -1,9 +1,15 @@ package com.crewmeister.cmcodingchallenge.exception; import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; + +import com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.convert.ConversionFailedException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -17,6 +23,8 @@ @ControllerAdvice public class GlobalExceptionHandler { + private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleValidationErrors(MethodArgumentNotValidException ex) { Map errors = new HashMap<>(); @@ -28,8 +36,23 @@ public ResponseEntity handleValidationErrors(MethodArgumentNotValidExcep return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); } + @ExceptionHandler({BindException.class}) + public ResponseEntity> handleBindExceptions(BindException ex) { + logger.error("Validation failed", ex); + Map errors = new HashMap<>(); + ex.getBindingResult().getFieldErrors().forEach(error -> { + if ("date".equals(error.getField()) && error.getRejectedValue() != null) { + errors.put("date", "Date must be a LocalDate in format yyyy-MM-dd"); + } else { + errors.put(error.getField(), error.getDefaultMessage()); + } + }); + return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); + } + @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity handleInvalidInput(HttpMessageNotReadableException ex) { + logger.error("Validation failed", ex); Map response = new HashMap<>(); response.put("status", HttpStatus.BAD_REQUEST.value()); response.put("error", "Invalid json input"); @@ -51,19 +74,24 @@ public ResponseEntity handleInvalidRequest(InvalidRequestException ex) { .body(Map.of("error", ex.getMessage())); } - @ExceptionHandler(MethodArgumentTypeMismatchException.class) - public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMismatchException ex) { - if (ex.getRequiredType() == CurrencyConstants.class) { - return ResponseEntity.badRequest() - .body(Map.of("error", "Invalid currency as allowed values are not valid currencies")); - } + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArguments(IllegalArgumentException ex) { + return ResponseEntity + .badRequest() + .body(Map.of("error", ex.getMessage())); + } - if (ex.getRequiredType() == LocalDate.class) { - return ResponseEntity.badRequest() - .body(Map.of("error", "Date must be in format yyyy-MM-dd")); - } + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public ResponseEntity handleTypeMismatch(MethodArgumentTypeMismatchException ex) { + String error = String.format("Invalid value '%s' for parameter '%s'. Expected type: %s", + ex.getValue(), ex.getName(), ex.getRequiredType().getSimpleName()); + return new ResponseEntity<>(Map.of("error", error), HttpStatus.BAD_REQUEST); + } - return ResponseEntity.badRequest() - .body(Map.of("error", "Invalid parameter: " + ex.getName())); + @ExceptionHandler(RuntimeException.class) + public ResponseEntity handleRuntimeException(RuntimeException ex) { + Map error = new HashMap<>(); + error.put("error", ex.getMessage()); + return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f42055a..448f866 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -14,6 +14,16 @@ spring.h2.console.path=/h2-console #BundesBank API URL bundesbank.api.base.url=https://api.statistiken.bundesbank.de/rest/download/ -bundesbank.api.key=BBEX3/D.XXX.EUR.BB.AC.000 +bundesbank.api.key=BBEX3/D.%s.EUR.BB.AC.000 bundesbank.api.format=sdmx bundesbank.api.lang=en + +#Timeout +rest.template.connection.timeout=10000 +rest.template.read.timeout=10000 + +#Logging +logging.level.root=INFO +logging.level.com.crewmeister=DEBUG +logging.file.name=logDetails.log + From fe8aa7a58fd8c00acaad1bc8443491aec02a0f08 Mon Sep 17 00:00:00 2001 From: Karan Date: Wed, 21 May 2025 23:19:16 +0200 Subject: [PATCH 3/4] CM-Test - Added the junit test cases and some fixes --- .../cmcodingchallenge/RestTemplateConfig.java | 2 +- .../cmcodingchallenge/currency/Currency.java | 8 + .../currencyservice/CurrencyServiceImpl.java | 34 +- .../exception/GlobalExceptionHandler.java | 7 - src/main/resources/application.properties | 4 - .../CmCodingChallengeApplicationTests.java | 3 + .../CurrencyControllerTests.java | 298 +++++++++++++++ .../servicetests/CurrencyServiceImplTest.java | 359 ++++++++++++++++++ 8 files changed, 690 insertions(+), 25 deletions(-) create mode 100644 src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java create mode 100644 src/test/java/com/crewmeister/cmcodingchallenge/servicetests/CurrencyServiceImplTest.java diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java b/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java index 3368ee6..8dc45c0 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/RestTemplateConfig.java @@ -20,7 +20,7 @@ public class RestTemplateConfig { public RestTemplate restTemplate() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(connectionTimeout); // in milliseconds - factory.setReadTimeout(readTimeout); + factory.setReadTimeout(readTimeout); // in milliseconds RestTemplate restTemplate = new RestTemplate(factory); restTemplate.getMessageConverters().add(new MappingJackson2XmlHttpMessageConverter()); return restTemplate; diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java b/src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java index 4a1c8b4..f98fbfe 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currency/Currency.java @@ -15,6 +15,14 @@ public class Currency { @NotBlank(message = "Currency name must not be blank") private String currencyName; + public Currency() { + } + + public Currency(Long currencyId, String currencyName) { + this.currencyId = currencyId; + this.currencyName = currencyName; + } + public Long getCurrencyId() { return currencyId; } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java index b5e3b49..d117f32 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java @@ -1,8 +1,6 @@ package com.crewmeister.cmcodingchallenge.currencyservice; -import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; import com.crewmeister.cmcodingchallenge.currency.CurrencyConversionRates; -import com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController; import com.crewmeister.cmcodingchallenge.exception.InvalidRequestException; import com.crewmeister.cmcodingchallenge.xmldata.GenericData; import com.crewmeister.cmcodingchallenge.currency.Currency; @@ -12,7 +10,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.ResponseEntity; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; @@ -20,6 +19,8 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.net.SocketTimeoutException; import java.util.*; @@ -45,29 +46,38 @@ public class CurrencyServiceImpl implements CurrencyService { private String bundesApiLang; - public CurrencyServiceImpl(RestTemplate restTemplate) { + private final CurrencyRepository currencyRepository; + + public CurrencyServiceImpl(RestTemplate restTemplate, CurrencyRepository currencyRepository) { this.restTemplate = restTemplate; + this.currencyRepository = currencyRepository; } - @Autowired - CurrencyRepository currencyRepository; + + @Cacheable("availableCurrencies") @Override public List getListOfAvailableCurrencies() { return currencyRepository.findAll(); } + @CacheEvict(value = "availableCurrencies", allEntries = true) @Override public List addCurrency(List currency) { return currencyRepository.saveAll(currency); } + @Cacheable(value = "currencyByName", key = "currencyName") + public Optional getCurrencyByName(String currencyName) { + return currencyRepository.findCurrencyName(currencyName); + } + @Override public Map> getFXRates(String date,String currency) { List currencies = new ArrayList<>(); if(currency==null || currency.isEmpty() ) - currencies= currencyRepository.findAll();//Assuming DB has values; if not insert values from controller + currencies= getListOfAvailableCurrencies();//Assuming DB has values; if not insert values from controller else { - Optional ccy = currencyRepository.findCurrencyName(currency); + Optional ccy = getCurrencyByName(currency); if(ccy.isPresent()) currencies.add(ccy.get()); else{ @@ -89,7 +99,7 @@ public Map> getFXRates(String date,String currency) for (Observation obs : genericData.dataSet.series.observations) { - if (date == null) { + if (date == null || date.isEmpty()) { if (obs.value == null) continue; fxMap.put(obs.dimension.date, obs.value.rate); @@ -133,7 +143,7 @@ public double getFXAmount(String date, String currency, double amount) { throw new IllegalArgumentException("Conversion rate not found for date " + date); } logger.info("Conversion rate for {} on {} is {}",currency,date,ccr.getConversionRate()); - double exchangedAmount = amount/ccr.getConversionRate() ; + double exchangedAmount = new BigDecimal(amount/ccr.getConversionRate()).setScale(4, RoundingMode.HALF_UP).doubleValue() ; return exchangedAmount; } @@ -161,11 +171,9 @@ private GenericData fetchRates(String url,String currency) { } catch (Exception e) { logger.error("Failed to fetch data from Bundesbank for currency {}: {}", currency, e.getMessage()); - throw new InvalidRequestException("Unable to retrieve FX rate data. Please try again later."); + throw new InvalidRequestException("Unable to retrieve FX rate data, please check logs for more details"); } } - - } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java index e5ba7a2..e9a4d5e 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java @@ -1,11 +1,7 @@ package com.crewmeister.cmcodingchallenge.exception; -import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; - -import com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.core.convert.ConversionFailedException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; @@ -16,7 +12,6 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import java.time.LocalDate; import java.util.HashMap; import java.util.Map; @@ -54,9 +49,7 @@ public ResponseEntity> handleBindExceptions(BindException ex public ResponseEntity handleInvalidInput(HttpMessageNotReadableException ex) { logger.error("Validation failed", ex); Map response = new HashMap<>(); - response.put("status", HttpStatus.BAD_REQUEST.value()); response.put("error", "Invalid json input"); - response.put("message", "Json input is not structured"); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 448f866..c72e9de 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -8,10 +8,6 @@ spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=update -# H2 Console -spring.h2.console.enabled=true -spring.h2.console.path=/h2-console - #BundesBank API URL bundesbank.api.base.url=https://api.statistiken.bundesbank.de/rest/download/ bundesbank.api.key=BBEX3/D.%s.EUR.BB.AC.000 diff --git a/src/test/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplicationTests.java b/src/test/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplicationTests.java index 0ca0d16..e8b23fd 100644 --- a/src/test/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplicationTests.java +++ b/src/test/java/com/crewmeister/cmcodingchallenge/CmCodingChallengeApplicationTests.java @@ -2,8 +2,11 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cache.annotation.EnableCaching; @SpringBootTest +@EnableCaching + class CmCodingChallengeApplicationTests { @Test diff --git a/src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java b/src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java new file mode 100644 index 0000000..c2974db --- /dev/null +++ b/src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java @@ -0,0 +1,298 @@ +package com.crewmeister.cmcodingchallenge.controllertests; + +import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; +import com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController; +import com.crewmeister.cmcodingchallenge.currencyservice.CurrencyService; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import com.crewmeister.cmcodingchallenge.currency.Currency; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.util.*; + +import java.util.stream.Collectors; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(CurrencyController.class) +public class CurrencyControllerTests { + + @Autowired + private MockMvc mvc; + + @MockBean + CurrencyService currencyService; + + @Test + public void testAddCurrencyWithNoCurrencies() throws Exception { + mvc.perform(MockMvcRequestBuilders + .post("/api/addCurrencies") + .contentType(MediaType.APPLICATION_JSON) + .content("{}") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().string("{\"error\":\"Currency list must not be null or empty\"}")); + } + + @Test + public void testAddCurrencyWithInvalidInputCurrencies() throws Exception { + String payLoad="{\n" + + " \"currencies\": [\n" + + " {\n" + + "\t\t\"currencyId\": 1,\n" + + "\t\t\"currencyName\":\"AUD\"\n" + + "},]\n" + //extra comma is added for malforming json + "}"; + + mvc.perform(MockMvcRequestBuilders + .post("/api/addCurrencies") + .contentType(MediaType.APPLICATION_JSON) + .content(payLoad) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().string("{\"error\":\"Invalid json input\"}")); + } + + @Test + public void testAddCurrencyWithValidInputCurrencies() throws Exception { + String payLoad="{\n" + + " \"currencies\": [\n" + + " {\n" + + "\t\t\"currencyId\": 1,\n" + + "\t\t\"currencyName\":\"AUD\"\n" + + "},\n" + + "{\n" + + "\t\t\"currencyId\": 2,\n" + + "\t\t\"currencyName\":\"BGN\"\n" + + "}]\n" + + "}"; + + mvc.perform(MockMvcRequestBuilders + .post("/api/addCurrencies") + .contentType(MediaType.APPLICATION_JSON) + .content(payLoad) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + void testGetAvailableCurrenciesFromDB() throws Exception { + List currencyList = new ArrayList<>(); + currencyList.add(new Currency(1L, "AUD")); + currencyList.add(new Currency(2L, "CHF")); + + String expected ="[\"AUD\",\"CHF\"]"; + + Mockito.when(currencyService.getListOfAvailableCurrencies()).thenReturn(currencyList); + + mvc.perform(MockMvcRequestBuilders + .get("/api/getAllAvailableCurrencies")) + .andExpect(status().isOk()) + .andExpect(content().string(expected)); + } + + @Test + void testGetAvailableCurrenciesFromEnum() throws Exception { + Mockito.when(currencyService.getListOfAvailableCurrencies()).thenReturn(Collections.emptyList()); + + List enumCurrencies = Arrays.stream(CurrencyConstants.values()) + .map(Enum::name) + .collect(Collectors.toList()); + + String expected = new ObjectMapper().writeValueAsString(enumCurrencies); + mvc.perform(MockMvcRequestBuilders + .get("/api/getAllAvailableCurrencies") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected)); + } + + @Test + void testGetAllFXRatesWhenDateAndCurrencyAreNull() throws Exception { + Map> fxRateMock = Map.of( + "GBP", Map.of("2025-05-16", "0.84270"), + "INR", Map.of("2025-05-15", "95.8200") + ); + Mockito.when(currencyService.getFXRates(null, null)).thenReturn(fxRateMock); + + String expected = new ObjectMapper().writeValueAsString(fxRateMock); + + mvc.perform(MockMvcRequestBuilders + .get("/api/getAllFXRates") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected)); + } + + @Test + void testGetAllFXRatesWhenDateExistsAndCurrencyIsNull() throws Exception { + String date = "2025-05-16"; + Map> fxRateMock = Map.of( + "GBP", Map.of("2025-05-16", "0.84270"), + "INR", Map.of("2025-05-16", "95.8200") + ); + Mockito.when(currencyService.getFXRates(date, null)).thenReturn(fxRateMock); + + String expected = new ObjectMapper().writeValueAsString(fxRateMock); + + mvc.perform(MockMvcRequestBuilders + .get("/api/getAllFXRates") + .param("date", date) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected)); + } + + @Test + void testGetAllFXRatesWhenDateisNullAndCurrencyExists() throws Exception { + String currency = "INR"; + Map> fxRateMock = Map.of( + "INR", Map.of("2025-05-16", "0.84270","2025-05-15","95.6470") + ); + Mockito.when(currencyService.getFXRates(null, currency)).thenReturn(fxRateMock); + + String expected = new ObjectMapper().writeValueAsString(fxRateMock); + + mvc.perform(MockMvcRequestBuilders + .get("/api/getAllFXRates") + .param("currency", currency) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected)); + } + + @Test + void testGetAllFXRatesWhenDateAndCurrencyExists() throws Exception { + String currency = "INR"; + String date = "2025-05-16"; + Map> fxRateMock = Map.of( + "INR", Map.of("2025-05-16", "0.84270") + ); + Mockito.when(currencyService.getFXRates(date, currency)).thenReturn(fxRateMock); + + String expected = new ObjectMapper().writeValueAsString(fxRateMock); + + mvc.perform(MockMvcRequestBuilders + .get("/api/getAllFXRates") + .param("date", date) + .param("currency", currency) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected)); + } + + @Test + void testGetAllFXRatesWithInvalidDateFormat() throws Exception { + String expected="{\"error\":\"Invalid value '05-05-2025' for parameter 'date'. Expected type: LocalDate\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getAllFXRates") + .param("date", "05-05-2025") // invalid format + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + + @Test + void testGetFXAmountWithNullDateInput() throws Exception { + String expected="{\"date\":\"Date is required\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "") + .param("currency", "INR") + .param("amount", "500.0")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + + @Test + void testGetFXAmountWithNullCurrencyInput() throws Exception { + String expected="{\"currency\":\"Currency is required\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "2025-05-16") + .param("currency", "") + .param("amount", "500.0")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + @Test + void testGetFXAmountWithNullAmountInput() throws Exception { + String expected="{\"amount\":\"Failed to convert property value of type 'java.lang.String' to required type 'double' for property 'amount'; nested exception is java.lang.NumberFormatException: empty String\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "2025-05-16") + .param("currency", "INR") + .param("amount", "")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + @Test + void testGetFXAmountWithInValidDateInput() throws Exception { + String expected="{\"date\":\"Date must be a LocalDate in format yyyy-MM-dd\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "16-05-2025") + .param("currency", "INR") + .param("amount", "500.0")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + @Test + void testGetFXAmountWithInValidCurrencyInput() throws Exception { + String expected="{\"currency\":\"Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "2025-05-16") + .param("currency", "INS") + .param("amount", "500.0")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + @Test + void testGetFXAmountWithZeroAmountInput() throws Exception { + String expected="{\"amount\":\"Amount must be a positive number\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "2025-05-16") + .param("currency", "INR") + .param("amount", "0")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + + @Test + void testGetFXAmountWithNegativeAmountInput() throws Exception { + String expected="{\"amount\":\"Amount must be a positive number\"}"; + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "2025-05-16") + .param("currency", "INR") + .param("amount", "-500")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(expected)); + } + @Test + void testGetFXAmountWithValidInputs() throws Exception { + double expectedAmount = 5.1966; + + Mockito.when(currencyService.getFXAmount("2025-05-16", "INR", 500.0)) + .thenReturn(expectedAmount); + + mvc.perform(MockMvcRequestBuilders + .get("/api/getFXAmount") + .param("date", "2025-05-16") + .param("currency", "INR") + .param("amount", "500.0")) + .andExpect(status().isOk()) + .andExpect(content().string("5.1966")); + + } + + +} diff --git a/src/test/java/com/crewmeister/cmcodingchallenge/servicetests/CurrencyServiceImplTest.java b/src/test/java/com/crewmeister/cmcodingchallenge/servicetests/CurrencyServiceImplTest.java new file mode 100644 index 0000000..bf624c9 --- /dev/null +++ b/src/test/java/com/crewmeister/cmcodingchallenge/servicetests/CurrencyServiceImplTest.java @@ -0,0 +1,359 @@ +package com.crewmeister.cmcodingchallenge.servicetests; + +import com.crewmeister.cmcodingchallenge.currency.Currency; +import com.crewmeister.cmcodingchallenge.currencyrepository.CurrencyRepository; +import com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl; +import com.crewmeister.cmcodingchallenge.exception.InvalidRequestException; +import com.crewmeister.cmcodingchallenge.xmldata.*; +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.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class CurrencyServiceImplTest { + + @Mock + private CurrencyRepository currencyRepository; + + @Mock + private RestTemplate restTemplate; + + @InjectMocks + private CurrencyServiceImpl currencyService; + + @BeforeEach + void setUp() { + ReflectionTestUtils.setField(currencyService, "bundesBaseUrl", "https://api.statistiken.bundesbank.de/rest/download/"); + ReflectionTestUtils.setField(currencyService, "bundesApiKey", "BBEX3/D.%s.EUR.BB.AC.000"); + ReflectionTestUtils.setField(currencyService, "bundesApiFormat", "sdmx"); + ReflectionTestUtils.setField(currencyService, "bundesApiLang", "en"); + } + + @Test + void testGetListOfAvailableCurrencies() { + List mockList = List.of(new Currency(1L, "AUD"), new Currency(2L, "BGN")); + when(currencyRepository.findAll()).thenReturn(mockList); + + List result = currencyService.getListOfAvailableCurrencies(); + assertEquals(2, result.size()); + verify(currencyRepository, times(1)).findAll(); + } + + @Test + void testAddCurrency() { + List input = List.of(new Currency(3L, "BRL")); + when(currencyRepository.saveAll(input)).thenReturn(input); + + List result = currencyService.addCurrency(input); + assertEquals("BRL", result.get(0).getCurrencyName()); + verify(currencyRepository, times(1)).saveAll(input); + } + + @Test + void testGetCurrencyByName() { + Currency currency = new Currency(4L, "CAD"); + when(currencyRepository.findCurrencyName("CAD")).thenReturn(Optional.of(currency)); + + Optional result = currencyService.getCurrencyByName("CAD"); + assertTrue(result.isPresent()); + assertEquals("CAD", result.get().getCurrencyName()); + } + + @Test + void testGetFXRatesWithValidCurrencyAndDate() { + Currency ccy = new Currency(1L, "INR"); + when(currencyRepository.findCurrencyName("INR")).thenReturn(Optional.of(ccy)); + + ObsValue obsValue = new ObsValue(); + obsValue.rate="95.8200"; + ObsDimension obsDimension = new ObsDimension(); + obsDimension.date="2025-05-16"; + + Observation obs = new Observation(); + obs.value = obsValue; + obs.dimension = obsDimension; + + Series series = new Series(); + series.observations = List.of(obs); + + DataSet dataSet = new DataSet(); + dataSet.series = series; + + GenericData genericData = new GenericData(); + genericData.dataSet = dataSet; + + + + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenReturn(new ResponseEntity<>(genericData, HttpStatus.OK)); + + Map> result = currencyService.getFXRates("2025-05-16", "INR"); + + assertTrue(result.containsKey("INR")); + assertEquals("95.8200", result.get("INR").get("2025-05-16")); + } + + @Test + void testGetFXRatesWithValidCurrencyAndWeekendDate() { + Currency ccy = new Currency(1L, "INR"); + when(currencyRepository.findCurrencyName("INR")).thenReturn(Optional.of(ccy)); + + + ObsDimension obsDimension = new ObsDimension(); + obsDimension.date="2025-05-16"; + + Observation obs = new Observation(); + obs.dimension = obsDimension; + + Series series = new Series(); + series.observations = List.of(obs); + + DataSet dataSet = new DataSet(); + dataSet.series = series; + + GenericData genericData = new GenericData(); + genericData.dataSet = dataSet; + + + + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenReturn(new ResponseEntity<>(genericData, HttpStatus.OK)); + + Map> result = currencyService.getFXRates("2025-05-16", "INR"); + + assertTrue(result.containsKey("INR")); + assertEquals("Rate cannot be fetched as it is weekend or public holiday", result.get("INR").get("2025-05-16")); + } + + @Test + void testGetFXRatesWithValidDateAndCurrencyAsNull() { + List mockList = List.of(new Currency(1L, "INR"), new Currency(2L, "GBP")); + when(currencyService.getListOfAvailableCurrencies()).thenReturn(mockList); + + ObsValue obsValue1 = new ObsValue(); + obsValue1.rate="95.8201"; + ObsDimension obsDimension1 = new ObsDimension(); + obsDimension1.date="2025-05-16"; + + ObsValue obsValue2 = new ObsValue(); + obsValue2.rate="0.8427"; + ObsDimension obsDimension2 = new ObsDimension(); + obsDimension2.date="2025-05-16"; + + Observation obs1 = new Observation(); + obs1.dimension = obsDimension1; + obs1.value = obsValue1; + + Observation obs2 = new Observation(); + obs2.dimension = obsDimension2; + obs2.value = obsValue2; + + Series series1 = new Series(); + Series series2 = new Series(); + series1.observations = List.of(obs1); + series2.observations = List.of(obs2); + + DataSet dataSet1 = new DataSet(); + DataSet dataSet2 = new DataSet(); + dataSet1.series = series1; + dataSet2.series = series2; + + GenericData genericData1 = new GenericData(); + GenericData genericData2 = new GenericData(); + genericData1.dataSet = dataSet1; + genericData2.dataSet = dataSet2; + + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenAnswer(invocation -> { + String url = invocation.getArgument(0, String.class); + if (url.contains("INR")) { + return new ResponseEntity<>(genericData1, HttpStatus.OK); + } else if (url.contains("GBP")) { + return new ResponseEntity<>(genericData2, HttpStatus.OK); + } else { + return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); + } + }); + + Map> result = currencyService.getFXRates("2025-05-16", ""); + System.out.println(result); + assertEquals(2, result.size()); + assertEquals(result.get("INR").get("2025-05-16"),"95.8201"); + assertEquals(result.get("GBP").get("2025-05-16"),"0.8427"); + } + + @Test + void testGetFXRatesWithDateAndCurrencyBothAsNull() { + List mockList = List.of(new Currency(1L, "INR"), new Currency(2L, "GBP")); + when(currencyService.getListOfAvailableCurrencies()).thenReturn(mockList); + + ObsValue obsValue1 = new ObsValue(); + obsValue1.rate="95.8201"; + ObsDimension obsDimension1 = new ObsDimension(); + obsDimension1.date="2025-05-15"; + + ObsValue obsValue2 = new ObsValue(); + obsValue2.rate="0.8427"; + ObsDimension obsDimension2 = new ObsDimension(); + obsDimension2.date="2025-05-16"; + + Observation obs1 = new Observation(); + obs1.dimension = obsDimension1; + obs1.value = obsValue1; + + Observation obs2 = new Observation(); + obs2.dimension = obsDimension2; + obs2.value = obsValue2; + + Series series1 = new Series(); + Series series2 = new Series(); + series1.observations = List.of(obs1); + series2.observations = List.of(obs2); + + DataSet dataSet1 = new DataSet(); + DataSet dataSet2 = new DataSet(); + dataSet1.series = series1; + dataSet2.series = series2; + + GenericData genericData1 = new GenericData(); + GenericData genericData2 = new GenericData(); + genericData1.dataSet = dataSet1; + genericData2.dataSet = dataSet2; + + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenAnswer(invocation -> { + String url = invocation.getArgument(0, String.class); + if (url.contains("INR")) { + return new ResponseEntity<>(genericData1, HttpStatus.OK); + } else if (url.contains("GBP")) { + return new ResponseEntity<>(genericData2, HttpStatus.OK); + } else { + return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); + } + }); + + Map> result = currencyService.getFXRates(null, ""); + assertEquals(2, result.size()); + assertEquals("95.8201",result.get("INR").get("2025-05-15")); + assertEquals("0.8427",result.get("GBP").get("2025-05-16")); + } + + @Test + void testGetFXAmountWithValidInputs() { + ObsValue obsValue = new ObsValue(); + obsValue.rate="95.8200"; + ObsDimension obsDimension = new ObsDimension(); + obsDimension.date="2025-05-16"; + + Observation obs = new Observation(); + obs.dimension = obsDimension; + obs.value = obsValue; + + Series series = new Series(); + series.observations = List.of(obs); + + DataSet dataSet = new DataSet(); + dataSet.series = series; + + GenericData genericData = new GenericData(); + genericData.dataSet = dataSet; + + + + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenReturn(new ResponseEntity<>(genericData, HttpStatus.OK)); + + double result = currencyService.getFXAmount("2025-05-16","INR",500); + assertEquals(5.2181,result); + } + + @Test + void testGetFXAmountWithGenericDataAsNull() { + GenericData genericData = new GenericData(); + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenReturn(new ResponseEntity<>(genericData, HttpStatus.OK)); + RuntimeException exception = assertThrows(RuntimeException.class, () -> + currencyService.getFXAmount("2025-05-16", "INR", 500.00) + ); + + assertEquals("Generic data is unavailable for currency: INR", exception.getMessage()); + } + + @Test + void testGetFXAmountWithRateAsNull() { + + ObsDimension obsDimension = new ObsDimension(); + obsDimension.date="2025-05-16"; + + Observation obs = new Observation(); + obs.dimension = obsDimension; + obs.value = null; + + Series series = new Series(); + series.observations = List.of(obs); + + DataSet dataSet = new DataSet(); + dataSet.series = series; + + GenericData genericData = new GenericData(); + genericData.dataSet = dataSet; + + + + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenReturn(new ResponseEntity<>(genericData, HttpStatus.OK)); + + RuntimeException exception = assertThrows(IllegalArgumentException.class, () -> + currencyService.getFXAmount("2025-05-16", "INR", 500.00) + ); + + assertEquals("Conversion rate not found for date 2025-05-16", exception.getMessage()); + } + + @Test + void testFetchRatesThrowsException() { + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenThrow(new RestClientException("Invalid URL")); + + InvalidRequestException exception = assertThrows(InvalidRequestException.class, () -> + currencyService.getFXAmount("2025-05-16", "INR", 500.00) + ); + + assertEquals("Unable to retrieve FX rate data, please check logs for more details", exception.getMessage()); + } + + @Test + void testRestTemplateTimeout() { + when(currencyRepository.findCurrencyName("INR")) + .thenReturn(Optional.of(new Currency(1L, "INR"))); + when(restTemplate.getForEntity(anyString(), eq(GenericData.class))) + .thenThrow(new ResourceAccessException("Read timed out")); + + assertThrows( + RuntimeException.class, + () -> currencyService.getFXRates("2025-05-16", "INR"), + "Expected timeout to result in RuntimeException" + ); + + verify(restTemplate, atLeast(1)).getForEntity(anyString(), eq(GenericData.class)); + } + + +} + From 61dd9c6300c0f508e50cc87a5ae7fd21c5e251b1 Mon Sep 17 00:00:00 2001 From: Karan Date: Thu, 22 May 2025 17:20:03 +0200 Subject: [PATCH 4/4] CM-Test - added security --- logDetails.log | 8507 ++++++++++++++--- pom.xml | 5 + .../CurrencyController.java | 2 +- .../currencyservice/CurrencyServiceImpl.java | 4 +- .../exception/GlobalExceptionHandler.java | 2 +- .../cmcodingchallenge/security/ApiUsers.java | 51 + .../security/MyUserDetailsService.java | 37 + .../security/SecurityConfig.java | 41 + .../security/UserRepository.java | 9 + src/main/resources/application.properties | 6 +- src/main/resources/data.sql | 3 + .../CurrencyControllerTests.java | 53 +- 12 files changed, 7599 insertions(+), 1121 deletions(-) create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/security/ApiUsers.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/security/MyUserDetailsService.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/security/SecurityConfig.java create mode 100644 src/main/java/com/crewmeister/cmcodingchallenge/security/UserRepository.java create mode 100644 src/main/resources/data.sql diff --git a/logDetails.log b/logDetails.log index a10179c..28f1488 100644 --- a/logDetails.log +++ b/logDetails.log @@ -1,74 +1,1585 @@ -2025-05-20 16:07:06.867 INFO 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 14472 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 16:07:06.882 DEBUG 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 16:07:06.882 INFO 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 16:07:06.960 INFO 14472 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 16:07:06.960 INFO 14472 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 16:07:08.113 INFO 14472 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 16:07:08.207 INFO 14472 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 75 ms. Found 1 JPA repository interfaces. -2025-05-20 16:07:09.441 INFO 14472 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 16:07:09.472 INFO 14472 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 16:07:09.472 INFO 14472 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 16:07:09.628 INFO 14472 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 16:07:09.628 INFO 14472 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2668 ms -2025-05-20 16:07:09.706 INFO 14472 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 16:07:09.863 INFO 14472 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 16:07:09.878 INFO 14472 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 16:07:10.035 INFO 14472 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 16:07:10.128 INFO 14472 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 16:07:10.347 INFO 14472 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 16:07:10.519 INFO 14472 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 16:07:11.534 INFO 14472 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 16:07:11.550 INFO 14472 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 16:07:11.566 INFO 14472 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 16:07:12.269 WARN 14472 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 16:07:12.425 INFO 14472 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 16:07:12.753 INFO 14472 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 16:07:12.769 INFO 14472 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.643 seconds (JVM running for 7.432) -2025-05-20 16:08:00.673 INFO 14472 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 16:08:00.681 INFO 14472 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 16:08:00.690 INFO 14472 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 7 ms -2025-05-20 16:08:00.831 INFO 14472 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@35099f8b -2025-05-20 17:21:02.398 INFO 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 5180 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 17:21:02.404 DEBUG 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 17:21:02.405 INFO 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 17:21:02.702 INFO 5180 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 17:21:02.703 INFO 5180 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 17:21:04.017 INFO 5180 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 17:21:04.118 INFO 5180 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 84 ms. Found 1 JPA repository interfaces. -2025-05-20 17:21:04.570 INFO 5180 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$5e6cd9d6] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 17:21:05.358 INFO 5180 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 17:21:05.376 INFO 5180 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 17:21:05.377 INFO 5180 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 17:21:05.513 INFO 5180 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 17:21:05.514 INFO 5180 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2809 ms -2025-05-20 17:21:05.593 INFO 5180 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 17:21:05.837 INFO 5180 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 17:21:05.847 INFO 5180 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 17:21:06.015 INFO 5180 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 17:21:06.121 INFO 5180 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 17:21:06.377 INFO 5180 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 17:21:06.561 INFO 5180 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 17:21:07.597 INFO 5180 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 17:21:07.611 INFO 5180 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 17:21:07.642 INFO 5180 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 17:21:08.328 WARN 5180 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 17:21:08.538 INFO 5180 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 17:21:08.962 INFO 5180 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 17:21:08.980 INFO 5180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.394 seconds (JVM running for 8.376) -2025-05-20 17:21:37.138 INFO 5180 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 17:21:37.139 INFO 5180 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 17:21:37.141 INFO 5180 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms -2025-05-20 17:21:37.440 INFO 5180 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 17:21:37.454 ERROR 5180 --- [http-nio-8080-exec-1] c.c.c.exception.GlobalExceptionHandler : Validation failed - -java.lang.IllegalArgumentException: Currency list must not be null or empty - at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.addCurrency(CurrencyController.java:35) ~[classes/:na] +2025-05-22 12:32:12.443 INFO 12344 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12344 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 12:32:12.472 DEBUG 12344 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 12:32:12.474 INFO 12344 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 12:32:12.988 INFO 12344 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 12:32:13.051 INFO 12344 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 12:32:14.912 WARN 12344 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'passwordEncoder' defined in class path resource [com/crewmeister/cmcodingchallenge/security/PasswordConfig.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=passwordConfig; factoryMethodName=passwordEncoder; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/crewmeister/cmcodingchallenge/security/PasswordConfig.class]] for bean 'passwordEncoder': There is already [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=myUserDetailsService; factoryMethodName=passwordEncoder; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/crewmeister/cmcodingchallenge/security/MyUserDetailsService.class]] bound. +2025-05-22 12:32:14.938 INFO 12344 --- [restartedMain] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-05-22 12:32:14.983 ERROR 12344 --- [restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +The bean 'passwordEncoder', defined in class path resource [com/crewmeister/cmcodingchallenge/security/PasswordConfig.class], could not be registered. A bean with that name has already been defined in class path resource [com/crewmeister/cmcodingchallenge/security/MyUserDetailsService.class] and overriding is disabled. + +Action: + +Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true + +2025-05-22 12:33:22.502 INFO 6944 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 6944 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 12:33:22.507 DEBUG 6944 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 12:33:22.508 INFO 6944 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 12:33:22.640 INFO 6944 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 12:33:22.641 INFO 6944 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 12:33:24.009 INFO 6944 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 12:33:24.110 INFO 6944 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 85 ms. Found 1 JPA repository interfaces. +2025-05-22 12:33:24.703 INFO 6944 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$40c4f373] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 12:33:25.497 INFO 6944 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 12:33:25.517 INFO 6944 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 12:33:25.518 INFO 6944 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 12:33:25.636 INFO 6944 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 12:33:25.637 INFO 6944 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2992 ms +2025-05-22 12:33:25.704 INFO 6944 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 12:33:25.920 INFO 6944 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 12:33:25.930 INFO 6944 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 12:33:26.101 INFO 6944 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 12:33:26.201 INFO 6944 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 12:33:26.450 INFO 6944 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 12:33:26.652 INFO 6944 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 12:33:27.812 INFO 6944 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 12:33:27.826 INFO 6944 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 12:33:27.855 INFO 6944 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 12:33:28.836 WARN 6944 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 12:33:29.087 INFO 6944 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@59232f39, org.springframework.security.web.context.SecurityContextPersistenceFilter@16acd7e2, org.springframework.security.web.header.HeaderWriterFilter@4dc027bb, org.springframework.security.web.authentication.logout.LogoutFilter@15e5218a, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@57bbec7a, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@15e9b550, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@3633b2c6, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@112a9daa, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4f929a9e, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@5208a0a0, org.springframework.security.web.session.SessionManagementFilter@414093d, org.springframework.security.web.access.ExceptionTranslationFilter@1085352e, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3a5275e1] +2025-05-22 12:33:29.279 INFO 6944 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 12:33:29.622 INFO 6944 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 12:33:29.637 INFO 6944 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.975 seconds (JVM running for 9.068) +2025-05-22 12:34:53.531 INFO 6944 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 12:34:53.533 INFO 6944 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 12:34:53.535 INFO 6944 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2025-05-22 12:34:53.879 INFO 6944 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 12:35:06.870 INFO 6944 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 12:37:08.329 WARN 6944 --- [http-nio-8080-exec-4] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [287] milliseconds. +2025-05-22 14:34:19.505 INFO 8244 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 8244 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 14:34:19.509 DEBUG 8244 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 14:34:19.511 INFO 8244 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 14:34:19.631 INFO 8244 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 14:34:19.635 INFO 8244 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 14:34:20.966 INFO 8244 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 14:34:21.092 INFO 8244 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 105 ms. Found 1 JPA repository interfaces. +2025-05-22 14:34:21.666 INFO 8244 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$857aef2e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 14:34:22.403 INFO 8244 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 14:34:22.421 INFO 8244 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 14:34:22.421 INFO 8244 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 14:34:22.551 INFO 8244 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 14:34:22.552 INFO 8244 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2870 ms +2025-05-22 14:34:22.621 INFO 8244 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 14:34:22.807 INFO 8244 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 14:34:22.818 INFO 8244 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 14:34:23.055 INFO 8244 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 14:34:23.161 INFO 8244 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 14:34:23.389 INFO 8244 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 14:34:23.584 INFO 8244 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 14:34:24.640 INFO 8244 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 14:34:24.660 INFO 8244 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 14:34:24.689 INFO 8244 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 14:34:25.390 WARN 8244 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 14:34:25.626 INFO 8244 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@30467a73, org.springframework.security.web.context.SecurityContextPersistenceFilter@203d02f9, org.springframework.security.web.header.HeaderWriterFilter@6b57958c, org.springframework.security.web.authentication.logout.LogoutFilter@68eed210, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@75774921, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@1c7f945d, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@6d6f0611, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@80f3cb4, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6e83e44b, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@32c2965b, org.springframework.security.web.session.SessionManagementFilter@339d87fe, org.springframework.security.web.access.ExceptionTranslationFilter@67087d4f, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@d5fe616] +2025-05-22 14:34:25.816 INFO 8244 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 14:34:26.208 INFO 8244 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 14:34:26.226 INFO 8244 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.453 seconds (JVM running for 8.405) +2025-05-22 14:34:37.861 INFO 8244 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 14:34:37.865 INFO 8244 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 14:34:37.868 INFO 8244 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 14:34:38.246 WARN 8244 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [323] milliseconds. +2025-05-22 15:06:30.698 INFO 1036 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 1036 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:06:30.702 DEBUG 1036 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:06:30.704 INFO 1036 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:06:30.866 INFO 1036 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:06:30.869 INFO 1036 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:06:32.270 INFO 1036 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:06:32.373 INFO 1036 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 89 ms. Found 2 JPA repository interfaces. +2025-05-22 15:06:32.860 INFO 1036 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$d2a74f34] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:06:33.589 INFO 1036 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:06:33.606 INFO 1036 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:06:33.607 INFO 1036 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:06:33.736 INFO 1036 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:06:33.737 INFO 1036 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2865 ms +2025-05-22 15:06:33.809 INFO 1036 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:06:34.001 INFO 1036 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:06:34.010 INFO 1036 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:06:34.189 INFO 1036 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:06:34.274 INFO 1036 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:06:34.498 INFO 1036 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:06:34.693 INFO 1036 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:06:35.909 INFO 1036 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:06:35.923 INFO 1036 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:06:35.954 INFO 1036 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:06:36.946 WARN 1036 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:06:37.181 INFO 1036 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3e77924c, org.springframework.security.web.context.SecurityContextPersistenceFilter@6d5bb9c3, org.springframework.security.web.header.HeaderWriterFilter@6beef94c, org.springframework.security.web.authentication.logout.LogoutFilter@6ac23203, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@16480846, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@40dd38e9, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@891ba89, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7c3af82a, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@e241406, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4db5be11, org.springframework.security.web.session.SessionManagementFilter@1ed22a73, org.springframework.security.web.access.ExceptionTranslationFilter@46cdc7cb, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3c5ebf54] +2025-05-22 15:06:37.368 INFO 1036 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:06:37.694 INFO 1036 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:06:37.710 INFO 1036 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.74 seconds (JVM running for 8.631) +2025-05-22 15:06:45.327 INFO 1036 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:06:45.328 INFO 1036 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:06:45.330 INFO 1036 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 15:06:45.776 WARN 1036 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [349] milliseconds. +2025-05-22 15:08:03.691 INFO 1036 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 15:13:32.750 INFO 7544 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 7544 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:13:32.769 DEBUG 7544 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:13:32.774 INFO 7544 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:13:32.996 INFO 7544 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:13:32.998 INFO 7544 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:13:35.388 INFO 7544 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:13:35.550 INFO 7544 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 137 ms. Found 2 JPA repository interfaces. +2025-05-22 15:13:37.314 INFO 7544 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$f641bfe9] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:13:39.197 INFO 7544 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:13:39.231 INFO 7544 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:13:39.232 INFO 7544 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:13:39.462 INFO 7544 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:13:39.463 INFO 7544 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6462 ms +2025-05-22 15:13:39.600 INFO 7544 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:13:39.911 INFO 7544 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:13:39.926 INFO 7544 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:13:40.251 INFO 7544 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:13:40.396 INFO 7544 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:13:40.798 INFO 7544 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:13:41.100 INFO 7544 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:13:43.604 INFO 7544 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:13:43.632 INFO 7544 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:13:43.683 INFO 7544 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:13:44.866 WARN 7544 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:13:45.199 INFO 7544 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@78426005, org.springframework.security.web.context.SecurityContextPersistenceFilter@15610f4d, org.springframework.security.web.header.HeaderWriterFilter@71630a3a, org.springframework.security.web.authentication.logout.LogoutFilter@2a8ddce2, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@68abbd27, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@4459fc36, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@7a2578b3, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7089980b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6a73515a, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7fe5d08c, org.springframework.security.web.session.SessionManagementFilter@7334c58d, org.springframework.security.web.access.ExceptionTranslationFilter@43b58d6e, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@17215a2d] +2025-05-22 15:13:45.617 INFO 7544 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:13:46.229 INFO 7544 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:13:46.263 INFO 7544 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 16.145 seconds (JVM running for 17.456) +2025-05-22 15:13:52.293 WARN 7544 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [418] milliseconds. +2025-05-22 15:13:52.328 INFO 7544 --- [http-nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:13:52.329 INFO 7544 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:13:52.331 INFO 7544 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 15:14:38.137 INFO 3224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 3224 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:14:38.142 DEBUG 3224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:14:38.143 INFO 3224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:14:38.228 INFO 3224 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:14:38.230 INFO 3224 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:14:39.357 INFO 3224 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:14:39.454 INFO 3224 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 82 ms. Found 2 JPA repository interfaces. +2025-05-22 15:14:39.905 INFO 3224 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$2936256e] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:14:40.605 INFO 3224 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:14:40.621 INFO 3224 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:14:40.622 INFO 3224 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:14:40.745 INFO 3224 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:14:40.746 INFO 3224 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2514 ms +2025-05-22 15:14:40.812 INFO 3224 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:14:40.966 INFO 3224 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:14:40.974 INFO 3224 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:14:41.156 INFO 3224 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:14:41.239 INFO 3224 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:14:41.467 INFO 3224 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:14:41.635 INFO 3224 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:14:42.599 INFO 3224 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:14:42.612 INFO 3224 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:14:42.638 INFO 3224 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:14:43.399 WARN 3224 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:14:43.667 INFO 3224 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3625c05, org.springframework.security.web.context.SecurityContextPersistenceFilter@108c39e5, org.springframework.security.web.header.HeaderWriterFilter@1d4a49f1, org.springframework.security.web.authentication.logout.LogoutFilter@51024efd, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3564a253, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@21fe7b07, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@7587ca4f, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@3d7d4c97, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@496720d2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@790bb896, org.springframework.security.web.session.SessionManagementFilter@33c4ae13, org.springframework.security.web.access.ExceptionTranslationFilter@14e13b79, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@983c606] +2025-05-22 15:14:43.839 INFO 3224 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:14:44.141 INFO 3224 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:14:44.156 INFO 3224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.693 seconds (JVM running for 7.474) +2025-05-22 15:14:54.349 WARN 3224 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [400] milliseconds. +2025-05-22 15:14:54.377 INFO 3224 --- [http-nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:14:54.378 INFO 3224 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:14:54.379 INFO 3224 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2025-05-22 15:16:49.208 INFO 5548 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 5548 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:16:49.213 DEBUG 5548 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:16:49.214 INFO 5548 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:16:49.296 INFO 5548 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:16:49.297 INFO 5548 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:16:50.399 INFO 5548 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:16:50.494 INFO 5548 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 80 ms. Found 2 JPA repository interfaces. +2025-05-22 15:16:50.944 INFO 5548 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$11939be5] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:16:51.691 INFO 5548 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:16:51.706 INFO 5548 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:16:51.707 INFO 5548 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:16:51.849 INFO 5548 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:16:51.850 INFO 5548 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2552 ms +2025-05-22 15:16:51.954 INFO 5548 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:16:52.119 INFO 5548 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:16:52.130 INFO 5548 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:16:52.340 INFO 5548 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:16:52.443 INFO 5548 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:16:52.711 INFO 5548 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:16:52.876 INFO 5548 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:16:54.296 INFO 5548 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:16:54.315 INFO 5548 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:16:54.347 INFO 5548 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:16:55.283 WARN 5548 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:16:55.479 INFO 5548 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@46536e9d, org.springframework.security.web.context.SecurityContextPersistenceFilter@252804fe, org.springframework.security.web.header.HeaderWriterFilter@7b20a526, org.springframework.security.web.authentication.logout.LogoutFilter@60a7540e, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@efc87b5, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@361fbec1, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@1e085b24, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@55ede79a, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5e8ac6ea, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7c45a479, org.springframework.security.web.session.SessionManagementFilter@34e3c043, org.springframework.security.web.access.ExceptionTranslationFilter@4e9b218c, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@765f3b50] +2025-05-22 15:16:55.661 INFO 5548 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:16:55.982 INFO 5548 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:16:55.998 INFO 5548 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.497 seconds (JVM running for 8.384) +2025-05-22 15:17:04.463 WARN 5548 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [294] milliseconds. +2025-05-22 15:17:04.480 INFO 5548 --- [http-nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:17:04.481 INFO 5548 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:17:04.483 INFO 5548 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 15:19:49.354 INFO 9096 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 9096 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:19:49.359 DEBUG 9096 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:19:49.360 INFO 9096 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:19:49.468 INFO 9096 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:19:49.470 INFO 9096 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:19:50.830 INFO 9096 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:19:50.938 INFO 9096 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 91 ms. Found 2 JPA repository interfaces. +2025-05-22 15:19:51.436 INFO 9096 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$2f2774ee] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:19:52.180 INFO 9096 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:19:52.197 INFO 9096 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:19:52.197 INFO 9096 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:19:52.320 INFO 9096 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:19:52.321 INFO 9096 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2847 ms +2025-05-22 15:19:52.394 INFO 9096 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:19:52.593 INFO 9096 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:19:52.606 INFO 9096 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:./data/testdb' +2025-05-22 15:19:52.776 INFO 9096 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:19:52.866 INFO 9096 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:19:53.095 INFO 9096 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:19:53.277 INFO 9096 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:19:54.289 INFO 9096 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:19:54.302 INFO 9096 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:19:54.331 INFO 9096 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:19:55.166 WARN 9096 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:19:55.375 INFO 9096 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@820cceb, org.springframework.security.web.context.SecurityContextPersistenceFilter@1f81602e, org.springframework.security.web.header.HeaderWriterFilter@4347071d, org.springframework.security.web.authentication.logout.LogoutFilter@48aa2409, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3cb03941, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@6994b988, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@575f61db, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@93e60f8, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1644317e, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@50e2377b, org.springframework.security.web.session.SessionManagementFilter@6ceaa5aa, org.springframework.security.web.access.ExceptionTranslationFilter@4ca992f8, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@65341cbc] +2025-05-22 15:19:55.563 INFO 9096 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:19:55.917 INFO 9096 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:19:55.932 INFO 9096 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.322 seconds (JVM running for 8.431) +2025-05-22 15:20:04.217 WARN 9096 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [306] milliseconds. +2025-05-22 15:20:04.241 INFO 9096 --- [http-nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:20:04.242 INFO 9096 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:20:04.244 INFO 9096 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 15:20:47.397 INFO 8252 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 8252 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:20:47.403 DEBUG 8252 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:20:47.404 INFO 8252 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:20:47.598 INFO 8252 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:20:47.598 INFO 8252 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:20:48.973 INFO 8252 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:20:49.102 INFO 8252 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 108 ms. Found 2 JPA repository interfaces. +2025-05-22 15:20:49.631 INFO 8252 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$87aa914f] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:20:50.480 INFO 8252 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:20:50.501 INFO 8252 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:20:50.502 INFO 8252 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:20:50.643 INFO 8252 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:20:50.644 INFO 8252 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3042 ms +2025-05-22 15:20:50.734 INFO 8252 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:20:52.266 ERROR 8252 --- [restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:67) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.ifAvailable(DefaultListableBeanFactory.java:2022) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:66) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1179) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:212) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:203) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:97) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.(ServletContextInitializerBeans.java:86) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:259) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:233) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:53) ~[spring-boot-2.4.1.jar:2.4.1] + at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na] + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:843) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na] + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardService.startInternal(StandardService.java:434) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.(TomcatWebServer.java:104) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:451) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:200) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:159) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:20:52.442 INFO 8252 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:20:52.563 INFO 8252 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:20:52.910 INFO 8252 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:20:53.159 INFO 8252 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:20:54.794 ERROR 8252 --- [restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:176) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:20:54.805 WARN 8252 --- [restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:176) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:20:54.826 INFO 8252 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:20:56.150 INFO 8252 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:20:58.192 ERROR 8252 --- [restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:40) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:65) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:59) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:155) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:96) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:316) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:20:58.195 WARN 8252 --- [restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 28000, SQLState: 28000 +2025-05-22 15:20:58.196 ERROR 8252 --- [restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : Wrong user name or password [28000-200] +2025-05-22 15:20:58.207 ERROR 8252 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution +2025-05-22 15:20:58.209 WARN 8252 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution +2025-05-22 15:20:58.214 INFO 8252 --- [restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] +2025-05-22 15:20:58.221 WARN 8252 --- [restartedMain] o.a.c.loader.WebappClassLoaderBase : The web application [ROOT] appears to have started a thread named [MVStore background writer nio:C:/Users/LENOVO/IntellijProjects/java-coding-challenge/data/testdb.mv.db] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: + java.base@11.0.27/java.lang.Object.wait(Native Method) + app//org.h2.mvstore.MVStore$BackgroundWriterThread.run(MVStore.java:3283) +2025-05-22 15:20:58.245 INFO 8252 --- [restartedMain] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-05-22 15:20:58.294 ERROR 8252 --- [restartedMain] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] +Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + ... 22 common frames omitted +Caused by: org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution + at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:69) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:40) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:65) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:59) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:155) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:96) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:316) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + ... 26 common frames omitted +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + ... 40 common frames omitted + +2025-05-22 15:21:58.080 INFO 1112 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 1112 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:21:58.086 DEBUG 1112 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:21:58.088 INFO 1112 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:21:58.245 INFO 1112 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:21:58.247 INFO 1112 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:21:59.864 INFO 1112 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:22:00.005 INFO 1112 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 119 ms. Found 2 JPA repository interfaces. +2025-05-22 15:22:00.628 INFO 1112 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$986ed89a] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:22:01.462 INFO 1112 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:22:01.477 INFO 1112 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:22:01.478 INFO 1112 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:22:01.635 INFO 1112 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:22:01.641 INFO 1112 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3389 ms +2025-05-22 15:22:01.776 INFO 1112 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:22:03.301 ERROR 1112 --- [restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.lambda$h2Console$0(H2ConsoleAutoConfiguration.java:67) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.ifAvailable(DefaultListableBeanFactory.java:2022) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.h2Console(H2ConsoleAutoConfiguration.java:66) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1179) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:212) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:203) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:97) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.ServletContextInitializerBeans.(ServletContextInitializerBeans.java:86) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:259) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:233) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:53) ~[spring-boot-2.4.1.jar:2.4.1] + at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na] + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:843) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] + at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na] + at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardService.startInternal(StandardService.java:434) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.(TomcatWebServer.java:104) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:451) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:200) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:159) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:22:03.459 INFO 1112 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:22:03.560 INFO 1112 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:22:03.822 INFO 1112 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:22:04.001 INFO 1112 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:22:05.617 ERROR 1112 --- [restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:176) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:22:05.631 WARN 1112 --- [restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:176) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:22:05.662 INFO 1112 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:22:06.500 INFO 1112 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:22:08.580 ERROR 1112 --- [restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:40) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:65) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:59) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:155) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:96) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:316) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] + +2025-05-22 15:22:08.588 WARN 1112 --- [restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 28000, SQLState: 28000 +2025-05-22 15:22:08.590 ERROR 1112 --- [restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : Wrong user name or password [28000-200] +2025-05-22 15:22:08.602 ERROR 1112 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution +2025-05-22 15:22:08.604 WARN 1112 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution +2025-05-22 15:22:08.609 INFO 1112 --- [restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] +2025-05-22 15:22:08.616 WARN 1112 --- [restartedMain] o.a.c.loader.WebappClassLoaderBase : The web application [ROOT] appears to have started a thread named [MVStore background writer nio:C:/Users/LENOVO/IntellijProjects/java-coding-challenge/data/testdb.mv.db] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: + java.base@11.0.27/java.lang.Object.wait(Native Method) + app//org.h2.mvstore.MVStore$BackgroundWriterThread.run(MVStore.java:3283) +2025-05-22 15:22:08.633 INFO 1112 --- [restartedMain] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-05-22 15:22:08.666 ERROR 1112 --- [restartedMain] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] +Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.2.jar:5.3.2] + ... 22 common frames omitted +Caused by: org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution + at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:69) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:40) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:65) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.(DatabaseInformationImpl.java:59) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:155) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:96) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:316) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.2.jar:5.3.2] + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.2.jar:5.3.2] + ... 26 common frames omitted +Caused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:461) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:170) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.validateUserAndPassword(Engine.java:357) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSessionAndValidate(Engine.java:176) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar:1.4.200] + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:173) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:152) ~[h2-1.4.200.jar:1.4.200] + at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.4.5.jar:na] + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43) ~[hibernate-core-5.4.25.Final.jar:5.4.25.Final] + ... 40 common frames omitted + +2025-05-22 15:22:56.317 INFO 7444 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 7444 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:22:56.321 DEBUG 7444 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:22:56.322 INFO 7444 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:22:56.409 INFO 7444 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:22:56.409 INFO 7444 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:22:57.590 INFO 7444 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:22:57.691 INFO 7444 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 87 ms. Found 2 JPA repository interfaces. +2025-05-22 15:22:58.163 INFO 7444 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$2f2774ee] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:22:58.879 INFO 7444 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:22:58.892 INFO 7444 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:22:58.892 INFO 7444 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:22:59.005 INFO 7444 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:22:59.006 INFO 7444 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2595 ms +2025-05-22 15:22:59.073 INFO 7444 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:22:59.264 INFO 7444 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:22:59.273 INFO 7444 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:./data/testdb' +2025-05-22 15:22:59.426 INFO 7444 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:22:59.517 INFO 7444 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:22:59.680 INFO 7444 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:22:59.849 INFO 7444 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:23:00.796 INFO 7444 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:23:00.809 INFO 7444 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:23:00.838 INFO 7444 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:23:01.594 WARN 7444 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:23:01.813 INFO 7444 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@24f1c596, org.springframework.security.web.context.SecurityContextPersistenceFilter@2219d728, org.springframework.security.web.header.HeaderWriterFilter@a46d91b, org.springframework.security.web.authentication.logout.LogoutFilter@654507ac, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@7d59f806, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@48aa2409, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@62b63290, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4b527a80, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6e9e5cec, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@472d07cb, org.springframework.security.web.session.SessionManagementFilter@712a603a, org.springframework.security.web.access.ExceptionTranslationFilter@13390a6c, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7eb12c97] +2025-05-22 15:23:02.038 INFO 7444 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:23:02.405 INFO 7444 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:23:02.421 INFO 7444 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.799 seconds (JVM running for 7.524) +2025-05-22 15:23:24.517 WARN 7444 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [321] milliseconds. +2025-05-22 15:23:24.535 INFO 7444 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:23:24.536 INFO 7444 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:23:24.539 INFO 7444 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 15:28:17.224 INFO 13040 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 13040 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:28:17.228 DEBUG 13040 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:28:17.229 INFO 13040 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:28:17.316 INFO 13040 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:28:17.317 INFO 13040 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:28:18.654 INFO 13040 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:28:18.748 INFO 13040 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 80 ms. Found 2 JPA repository interfaces. +2025-05-22 15:28:19.239 INFO 13040 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$a0bc454c] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:28:20.286 INFO 13040 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:28:20.322 INFO 13040 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:28:20.326 INFO 13040 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:28:20.498 INFO 13040 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:28:20.500 INFO 13040 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3176 ms +2025-05-22 15:28:20.642 INFO 13040 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:28:20.916 INFO 13040 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:28:20.924 INFO 13040 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:file:./data/testdb' +2025-05-22 15:28:21.098 INFO 13040 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:28:21.195 INFO 13040 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:28:21.437 INFO 13040 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:28:21.615 INFO 13040 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:28:22.659 INFO 13040 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:28:22.675 INFO 13040 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:28:22.708 INFO 13040 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:28:23.524 WARN 13040 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:28:23.796 INFO 13040 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5637c2c4, org.springframework.security.web.context.SecurityContextPersistenceFilter@342af959, org.springframework.security.web.header.HeaderWriterFilter@69ceed48, org.springframework.security.web.authentication.logout.LogoutFilter@415d0955, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@47bcdfca, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@55bfeb04, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@5e16a68c, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@2ae444a5, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@188f36b1, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@5d25946b, org.springframework.security.web.session.SessionManagementFilter@48227365, org.springframework.security.web.access.ExceptionTranslationFilter@7cf02db0, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@25129933] +2025-05-22 15:28:24.030 INFO 13040 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:28:24.467 INFO 13040 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:28:24.483 INFO 13040 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 8.039 seconds (JVM running for 9.041) +2025-05-22 15:28:32.771 WARN 13040 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [376] milliseconds. +2025-05-22 15:28:32.786 INFO 13040 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:28:32.787 INFO 13040 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:28:32.790 INFO 13040 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-05-22 15:32:00.515 INFO 4108 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 4108 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:32:00.521 DEBUG 4108 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:32:00.527 INFO 4108 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:32:00.743 INFO 4108 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:32:00.745 INFO 4108 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:32:02.758 INFO 4108 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:32:02.895 INFO 4108 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 118 ms. Found 2 JPA repository interfaces. +2025-05-22 15:32:03.649 INFO 4108 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$ff81cb2c] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:32:04.665 INFO 4108 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:32:04.686 INFO 4108 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:32:04.690 INFO 4108 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:32:04.865 INFO 4108 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:32:04.867 INFO 4108 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4114 ms +2025-05-22 15:32:04.994 INFO 4108 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:32:05.236 INFO 4108 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:32:05.250 INFO 4108 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:32:05.547 INFO 4108 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:32:05.685 INFO 4108 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:32:06.032 INFO 4108 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:32:06.317 INFO 4108 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:32:07.977 INFO 4108 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:32:08.010 INFO 4108 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:32:08.077 INFO 4108 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:32:08.111 WARN 4108 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/C:/Users/LENOVO/IntellijProjects/java-coding-challenge/target/classes/data.sql]: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL ); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" already exists; SQL statement: +CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL ) [42101-200] +2025-05-22 15:32:08.347 WARN 4108 --- [restartedMain] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method failed on bean with name 'inMemoryDatabaseShutdownExecutor': org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] +2025-05-22 15:32:08.348 INFO 4108 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-05-22 15:32:08.381 INFO 4108 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-05-22 15:32:08.394 INFO 4108 --- [restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] +2025-05-22 15:32:08.442 INFO 4108 --- [restartedMain] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-05-22 15:32:08.518 ERROR 4108 --- [restartedMain] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/C:/Users/LENOVO/IntellijProjects/java-coding-challenge/target/classes/data.sql]: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL ); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" already exists; SQL statement: +CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL ) [42101-200] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:617) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1159) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) ~[spring-boot-2.4.1.jar:2.4.1] + at com.crewmeister.cmcodingchallenge.CmCodingChallengeApplication.main(CmCodingChallengeApplication.java:12) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.4.1.jar:2.4.1] +Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/C:/Users/LENOVO/IntellijProjects/java-coding-challenge/target/classes/data.sql]: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL ); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" already exists; SQL statement: +CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL ) [42101-200] + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:622) ~[spring-jdbc-5.3.2.jar:5.3.2] + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:254) ~[spring-jdbc-5.3.2.jar:5.3.2] + at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:49) ~[spring-jdbc-5.3.2.jar:5.3.2] + at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.runScripts(DataSourceInitializer.java:202) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.initSchema(DataSourceInitializer.java:119) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker.onApplicationEvent(DataSourceInitializerInvoker.java:91) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker.onApplicationEvent(DataSourceInitializerInvoker.java:38) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:426) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:383) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.publishEventIfRequired(DataSourceInitializedPublisher.java:110) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.postProcessAfterInitialization(DataSourceInitializedPublisher.java:101) ~[spring-boot-autoconfigure-2.4.1.jar:2.4.1] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:444) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609) ~[spring-beans-5.3.2.jar:5.3.2] + ... 21 common frames omitted +Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USERS" already exists; SQL statement: +CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL ) [42101-200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] + at org.h2.message.DbException.get(DbException.java:181) ~[h2-1.4.200.jar:1.4.200] + at org.h2.command.ddl.CreateTable.update(CreateTable.java:89) ~[h2-1.4.200.jar:1.4.200] + at org.h2.command.CommandContainer.update(CommandContainer.java:198) ~[h2-1.4.200.jar:1.4.200] + at org.h2.command.Command.executeUpdate(Command.java:251) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:228) ~[h2-1.4.200.jar:1.4.200] + at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201) ~[h2-1.4.200.jar:1.4.200] + at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-3.4.5.jar:na] + at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-3.4.5.jar:na] + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:601) ~[spring-jdbc-5.3.2.jar:5.3.2] + ... 37 common frames omitted + +2025-05-22 15:35:36.785 INFO 16740 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 16740 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:35:36.791 DEBUG 16740 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:35:36.793 INFO 16740 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:35:36.917 INFO 16740 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:35:36.918 INFO 16740 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:35:38.816 INFO 16740 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:35:38.944 INFO 16740 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 110 ms. Found 2 JPA repository interfaces. +2025-05-22 15:35:39.976 INFO 16740 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$b0c2adfc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:35:41.411 INFO 16740 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:35:41.431 INFO 16740 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:35:41.432 INFO 16740 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:35:41.564 INFO 16740 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:35:41.565 INFO 16740 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4644 ms +2025-05-22 15:35:41.663 INFO 16740 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:35:41.867 INFO 16740 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:35:41.880 INFO 16740 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:35:42.081 INFO 16740 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:35:42.183 INFO 16740 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:35:42.467 INFO 16740 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:35:42.860 INFO 16740 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:35:44.463 INFO 16740 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:35:44.478 INFO 16740 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:35:44.507 INFO 16740 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:35:45.359 WARN 16740 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:35:45.583 INFO 16740 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@215871a1, org.springframework.security.web.context.SecurityContextPersistenceFilter@5c3fc66c, org.springframework.security.web.header.HeaderWriterFilter@723e3538, org.springframework.security.web.authentication.logout.LogoutFilter@15057222, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3642e10b, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@6afdd50d, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@2d9169a7, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5ee3a18f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@11cd4907, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2e5e24a1, org.springframework.security.web.session.SessionManagementFilter@5f78e928, org.springframework.security.web.access.ExceptionTranslationFilter@4dd01899, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@542d556c] +2025-05-22 15:35:45.782 INFO 16740 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:35:46.146 INFO 16740 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:35:46.162 INFO 16740 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 10.225 seconds (JVM running for 11.346) +2025-05-22 15:36:06.549 INFO 16740 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:36:06.550 INFO 16740 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:36:06.553 INFO 16740 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 15:36:06.668 INFO 16740 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 15:36:14.965 WARN 16740 --- [http-nio-8080-exec-2] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [285] milliseconds. +2025-05-22 15:37:58.751 INFO 1348 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 1348 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:37:58.755 DEBUG 1348 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:37:58.756 INFO 1348 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:37:58.844 INFO 1348 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:37:58.844 INFO 1348 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:38:00.027 INFO 1348 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:38:00.136 INFO 1348 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 92 ms. Found 2 JPA repository interfaces. +2025-05-22 15:38:00.676 INFO 1348 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$3123c7a7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:38:01.390 INFO 1348 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:38:01.406 INFO 1348 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:38:01.407 INFO 1348 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:38:01.532 INFO 1348 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:38:01.532 INFO 1348 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2686 ms +2025-05-22 15:38:01.603 INFO 1348 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:38:01.779 INFO 1348 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:38:01.787 INFO 1348 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:38:01.964 INFO 1348 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:38:02.054 INFO 1348 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:38:02.285 INFO 1348 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:38:02.458 INFO 1348 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:38:03.427 INFO 1348 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:38:03.439 INFO 1348 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:38:03.467 INFO 1348 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:38:04.218 WARN 1348 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:38:04.432 INFO 1348 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@47621181, org.springframework.security.web.context.SecurityContextPersistenceFilter@5a57762b, org.springframework.security.web.header.HeaderWriterFilter@61a94bb8, org.springframework.security.web.authentication.logout.LogoutFilter@753291b3, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@4bbc2d78, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@3b716dd2, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@fe664c4, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@48664065, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@334ffc7f, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@15bf751f, org.springframework.security.web.session.SessionManagementFilter@4e368f92, org.springframework.security.web.access.ExceptionTranslationFilter@62616cf9, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@56ff5c5] +2025-05-22 15:38:04.623 INFO 1348 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:38:04.977 INFO 1348 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:38:04.992 INFO 1348 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.014 seconds (JVM running for 7.798) +2025-05-22 15:38:09.259 INFO 1348 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:38:09.260 INFO 1348 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:38:09.264 INFO 1348 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 15:38:09.664 WARN 1348 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [332] milliseconds. +2025-05-22 15:39:22.533 INFO 15140 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 15140 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:39:22.537 DEBUG 15140 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:39:22.538 INFO 15140 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:39:22.629 INFO 15140 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:39:22.631 INFO 15140 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:39:23.797 INFO 15140 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:39:23.895 INFO 15140 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 82 ms. Found 2 JPA repository interfaces. +2025-05-22 15:39:24.351 INFO 15140 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$f596277d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:39:25.050 INFO 15140 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:39:25.066 INFO 15140 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:39:25.067 INFO 15140 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:39:25.190 INFO 15140 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:39:25.191 INFO 15140 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2556 ms +2025-05-22 15:39:25.260 INFO 15140 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:39:25.419 INFO 15140 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:39:25.430 INFO 15140 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:39:25.626 INFO 15140 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:39:25.722 INFO 15140 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:39:25.978 INFO 15140 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:39:26.161 INFO 15140 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:39:27.211 INFO 15140 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:39:27.226 INFO 15140 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:39:27.264 INFO 15140 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:39:28.130 WARN 15140 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:39:28.350 INFO 15140 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7c45a479, org.springframework.security.web.context.SecurityContextPersistenceFilter@55ede79a, org.springframework.security.web.header.HeaderWriterFilter@34e3c043, org.springframework.security.web.authentication.logout.LogoutFilter@1e76e01c, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@6bf12bcf, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@2749703d, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@1479ba3c, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@17e66d79, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@542d556c, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@490309a8, org.springframework.security.web.session.SessionManagementFilter@252804fe, org.springframework.security.web.access.ExceptionTranslationFilter@30f2819e, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@231bf5d2] +2025-05-22 15:39:28.542 INFO 15140 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:39:28.929 INFO 15140 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:39:28.944 INFO 15140 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.102 seconds (JVM running for 7.844) +2025-05-22 15:39:31.470 INFO 15140 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:39:31.471 INFO 15140 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:39:31.476 INFO 15140 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms +2025-05-22 15:39:31.997 WARN 15140 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [411] milliseconds. +2025-05-22 15:39:50.288 INFO 15140 --- [http-nio-8080-exec-7] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 15:45:50.850 INFO 6800 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 6800 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:45:50.854 DEBUG 6800 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:45:50.855 INFO 6800 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:45:50.957 INFO 6800 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:45:50.959 INFO 6800 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:45:52.623 INFO 6800 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:45:52.734 INFO 6800 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 94 ms. Found 2 JPA repository interfaces. +2025-05-22 15:45:53.264 INFO 6800 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$3d1e2be6] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:45:54.279 INFO 6800 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:45:54.298 INFO 6800 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:45:54.300 INFO 6800 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:45:54.436 INFO 6800 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:45:54.436 INFO 6800 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3473 ms +2025-05-22 15:45:54.547 INFO 6800 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:45:54.763 INFO 6800 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:45:54.775 INFO 6800 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:45:54.954 INFO 6800 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:45:55.071 INFO 6800 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:45:55.295 INFO 6800 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:45:55.495 INFO 6800 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:45:57.025 INFO 6800 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:45:57.044 INFO 6800 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:45:57.078 INFO 6800 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:45:58.174 WARN 6800 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:45:58.441 INFO 6800 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@15b9e083, org.springframework.security.web.context.SecurityContextPersistenceFilter@46cdc7cb, org.springframework.security.web.header.HeaderWriterFilter@3777aa69, org.springframework.security.web.authentication.logout.LogoutFilter@272c683d, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@1f85fc3b, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@7089980b, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@17215a2d, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@17c4d232, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@25442983, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@5e4cf382, org.springframework.security.web.session.SessionManagementFilter@7058061b, org.springframework.security.web.access.ExceptionTranslationFilter@2f0d48cd, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@415d0955] +2025-05-22 15:45:58.719 INFO 6800 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:45:59.150 INFO 6800 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:45:59.165 INFO 6800 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 9.076 seconds (JVM running for 10.248) +2025-05-22 15:46:27.635 INFO 6800 --- [http-nio-8080-exec-10] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:46:27.637 INFO 6800 --- [http-nio-8080-exec-10] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:46:27.642 INFO 6800 --- [http-nio-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms +2025-05-22 15:49:18.882 INFO 16180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 16180 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 15:49:18.887 DEBUG 16180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 15:49:18.888 INFO 16180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 15:49:18.988 INFO 16180 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 15:49:18.989 INFO 16180 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 15:49:20.222 INFO 16180 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 15:49:20.330 INFO 16180 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 92 ms. Found 2 JPA repository interfaces. +2025-05-22 15:49:20.839 INFO 16180 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$167d0a3f] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 15:49:21.576 INFO 16180 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 15:49:21.594 INFO 16180 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 15:49:21.595 INFO 16180 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 15:49:21.723 INFO 16180 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 15:49:21.724 INFO 16180 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2731 ms +2025-05-22 15:49:21.804 INFO 16180 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 15:49:21.992 INFO 16180 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 15:49:22.003 INFO 16180 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 15:49:22.181 INFO 16180 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 15:49:22.267 INFO 16180 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 15:49:22.510 INFO 16180 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 15:49:22.695 INFO 16180 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 15:49:23.846 INFO 16180 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 15:49:23.860 INFO 16180 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 15:49:23.902 INFO 16180 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 15:49:25.405 WARN 16180 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 15:49:25.809 INFO 16180 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7436f384, org.springframework.security.web.context.SecurityContextPersistenceFilter@2256b62f, org.springframework.security.web.header.HeaderWriterFilter@260d1a28, org.springframework.security.web.authentication.logout.LogoutFilter@b1f28a5, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3c584224, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@1a009ea2, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@2b2345be, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1f5498c3, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@69fbbeec, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@37d7bd43, org.springframework.security.web.session.SessionManagementFilter@69e9a9f0, org.springframework.security.web.access.ExceptionTranslationFilter@1737fe6b, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2151651e] +2025-05-22 15:49:26.069 INFO 16180 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 15:49:26.435 INFO 16180 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 15:49:26.452 INFO 16180 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 8.303 seconds (JVM running for 9.173) +2025-05-22 15:54:39.994 INFO 16180 --- [http-nio-8080-exec-4] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 15:54:40.046 INFO 16180 --- [http-nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 15:54:40.290 INFO 16180 --- [http-nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed initialization in 236 ms +2025-05-22 15:54:40.726 INFO 16180 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 15:55:24.563 WARN 16180 --- [http-nio-8080-exec-6] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [362] milliseconds. +2025-05-22 15:55:36.719 INFO 16180 --- [http-nio-8080-exec-8] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 15:55:56.765 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 15:55:56.796 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 15:55:56.817 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:55:58.417 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 15:55:58.418 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:55:58.986 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 15:55:58.987 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:55:59.708 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 15:55:59.711 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:00.383 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 15:56:00.384 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:01.038 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 15:56:01.039 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:01.627 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 15:56:01.628 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:02.006 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 15:56:02.007 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:02.747 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 15:56:02.748 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:03.369 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 15:56:03.370 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:03.719 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 15:56:03.756 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:04.970 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 15:56:04.971 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:05.149 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 15:56:05.150 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:06.474 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 15:56:06.477 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:07.271 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 15:56:07.272 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:07.920 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 15:56:07.921 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:08.487 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 15:56:08.488 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:09.129 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 15:56:09.130 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:09.752 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 15:56:09.753 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:10.398 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 15:56:10.399 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:11.055 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 15:56:11.056 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:11.669 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 15:56:11.670 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:12.272 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 15:56:12.273 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:12.809 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 15:56:12.810 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:13.037 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 15:56:13.038 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:13.712 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 15:56:13.713 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:14.441 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 15:56:14.442 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:15.294 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 15:56:15.295 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:15.997 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 15:56:15.998 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:16.531 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 15:56:16.532 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:17.100 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 15:56:17.101 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:17.351 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 15:56:17.352 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:17.865 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 15:56:17.865 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:18.364 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 15:56:18.365 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:19.039 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 15:56:19.040 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:19.626 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 15:56:19.627 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:20.125 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 15:56:20.126 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:20.361 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 15:56:20.362 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:20.908 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 15:56:20.909 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:21.058 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 15:56:21.059 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:21.478 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 15:56:21.479 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:56:22.235 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 15:56:22.236 INFO 16180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:23.745 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 15:58:23.985 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 15:58:23.997 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:24.988 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 15:58:24.989 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:25.680 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 15:58:25.681 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:26.519 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 15:58:26.524 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:28.336 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 15:58:28.339 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:28.958 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 15:58:28.961 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:29.674 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 15:58:29.674 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:30.001 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 15:58:30.002 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:30.815 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 15:58:30.816 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:31.322 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 15:58:31.323 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:31.505 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 15:58:31.506 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:32.163 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 15:58:32.164 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:32.330 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 15:58:32.331 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:33.012 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 15:58:33.013 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:33.439 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 15:58:33.439 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:34.182 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 15:58:34.183 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:35.039 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 15:58:35.040 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:35.709 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 15:58:35.709 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:36.350 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 15:58:36.351 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:36.704 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 15:58:36.705 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:37.114 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 15:58:37.115 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:37.517 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 15:58:37.518 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:37.857 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 15:58:37.858 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:38.308 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 15:58:38.308 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:38.517 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 15:58:38.518 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:39.147 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 15:58:39.147 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:39.697 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 15:58:39.697 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:40.313 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 15:58:40.314 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:40.918 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 15:58:40.919 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:42.002 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 15:58:42.003 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:42.672 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 15:58:42.672 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:42.849 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 15:58:42.849 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:43.386 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 15:58:43.386 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:43.975 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 15:58:43.975 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:44.449 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 15:58:44.450 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:44.841 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 15:58:44.841 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:44.972 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 15:58:44.973 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:45.143 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 15:58:45.144 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:45.546 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 15:58:45.547 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:45.649 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 15:58:45.649 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:45.961 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 15:58:45.961 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:58:46.369 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 15:58:46.369 INFO 16180 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 15:59:47.293 INFO 16180 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 15:59:47.408 INFO 16180 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 15:59:47.408 INFO 16180 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:00:07.019 INFO 16180 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:00:07.022 INFO 16180 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:00:07.023 INFO 16180 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:00:36.661 WARN 16180 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-05-2'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-05-2]] +2025-05-22 16:00:49.740 WARN 16180 --- [http-nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '16-05-2025'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [16-05-2025]] +2025-05-22 16:01:29.454 INFO 16180 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:01:29.489 WARN 16180 --- [http-nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name as validated from db] +2025-05-22 16:01:48.801 INFO 16180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:01:48.806 INFO 16180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:01:48.808 INFO 16180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:02:45.774 INFO 16180 --- [http-nio-8080-exec-7] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@2f8b5866 +2025-05-22 16:02:45.788 INFO 16180 --- [http-nio-8080-exec-7] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:02:45.788 INFO 16180 --- [http-nio-8080-exec-7] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:02:46.331 INFO 16180 --- [http-nio-8080-exec-7] c.c.c.c.CurrencyServiceImpl : Conversion rate for INR on 2025-05-16 is 95.82 +2025-05-22 16:03:37.668 ERROR 16180 --- [http-nio-8080-exec-10] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [EUR]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'EUR'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.EUR] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -76,8 +1587,8 @@ java.lang.IllegalArgumentException: Currency list must not be null or empty at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.2.jar:5.3.2] - at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -85,6 +1596,50 @@ java.lang.IllegalArgumentException: Currency list must not be null or empty at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -114,37 +1669,218 @@ java.lang.IllegalArgumentException: Currency list must not be null or empty at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 17:21:37.503 WARN 5180 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.IllegalArgumentException: Currency list must not be null or empty] -2025-05-20 17:23:25.129 INFO 5180 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 17:23:34.616 INFO 5180 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the list of Currencies -2025-05-20 17:25:27.691 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 17:25:27.702 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 17:25:27.723 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:25:29.589 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH -2025-05-20 17:25:29.590 INFO 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:25:29.626 ERROR 5180 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] -2025-05-20 17:25:29.645 ERROR 5180 --- [http-nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Unable to retrieve FX rate data. Please try again later.] with root cause - -java.lang.RuntimeException: Unable to retrieve FX rate data. Please try again later. - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.fetchRates(CurrencyServiceImpl.java:150) ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:70) ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$8e9f7efe.getFXRates() ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] +2025-05-22 16:03:37.683 WARN 16180 --- [http-nio-8080-exec-10] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [EUR]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'EUR'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.EUR]] +2025-05-22 16:03:52.144 ERROR 16180 --- [http-nio-8080-exec-2] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [EUR]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'EUR'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.EUR] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-22 16:03:52.152 WARN 16180 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [EUR]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'EUR'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.EUR]] +2025-05-22 16:04:07.544 INFO 16180 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@519eb720 +2025-05-22 16:04:07.545 INFO 16180 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 16:04:07.546 INFO 16180 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:04:08.270 INFO 16180 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyServiceImpl : Conversion rate for NZD on 2025-05-16 is 1.8987 +2025-05-22 16:04:15.695 ERROR 16180 --- [http-nio-8080-exec-1] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [0.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-22 16:04:15.701 WARN 16180 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [0.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number]] +2025-05-22 16:04:21.933 ERROR 16180 --- [http-nio-8080-exec-4] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-200.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -161,6 +1897,50 @@ java.lang.RuntimeException: Unable to retrieve FX rate data. Please try again la at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -190,188 +1970,21 @@ java.lang.RuntimeException: Unable to retrieve FX rate data. Please try again la at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 17:33:19.429 INFO 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 14224 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 17:33:19.433 DEBUG 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 17:33:19.434 INFO 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 17:33:19.551 INFO 14224 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 17:33:19.552 INFO 14224 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 17:33:20.689 INFO 14224 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 17:33:20.805 INFO 14224 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 100 ms. Found 1 JPA repository interfaces. -2025-05-20 17:33:21.286 INFO 14224 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$d3ebbb69] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 17:33:22.055 INFO 14224 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 17:33:22.072 INFO 14224 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 17:33:22.072 INFO 14224 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 17:33:22.191 INFO 14224 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 17:33:22.192 INFO 14224 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2636 ms -2025-05-20 17:33:22.260 INFO 14224 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 17:33:22.465 INFO 14224 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 17:33:22.477 INFO 14224 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 17:33:22.642 INFO 14224 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 17:33:22.767 INFO 14224 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 17:33:23.027 INFO 14224 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 17:33:23.224 INFO 14224 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 17:33:24.277 INFO 14224 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 17:33:24.290 INFO 14224 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 17:33:24.332 INFO 14224 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 17:33:24.834 WARN 14224 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 17:33:24.997 INFO 14224 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 17:33:25.356 INFO 14224 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 17:33:25.372 INFO 14224 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.724 seconds (JVM running for 7.736) -2025-05-20 17:33:35.484 INFO 14224 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 17:33:35.485 INFO 14224 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 17:33:35.487 INFO 14224 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms -2025-05-20 17:33:35.823 INFO 14224 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 17:33:42.689 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 17:33:42.974 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 17:33:42.986 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:33:44.570 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH -2025-05-20 17:33:44.571 INFO 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:33:44.616 ERROR 14224 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] -2025-05-20 17:33:44.629 WARN 14224 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.crewmeister.cmcodingchallenge.exception.InvalidRequestException: Unable to retrieve FX rate data. Please try again later.] -2025-05-20 17:36:13.868 INFO 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12088 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 17:36:13.874 DEBUG 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 17:36:13.875 INFO 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 17:36:13.989 INFO 12088 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 17:36:13.991 INFO 12088 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 17:36:15.443 INFO 12088 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 17:36:15.564 INFO 12088 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 100 ms. Found 1 JPA repository interfaces. -2025-05-20 17:36:16.026 INFO 12088 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$437e0c] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 17:36:16.844 INFO 12088 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 17:36:16.861 INFO 12088 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 17:36:16.862 INFO 12088 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 17:36:17.002 INFO 12088 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 17:36:17.003 INFO 12088 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3010 ms -2025-05-20 17:36:17.099 INFO 12088 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 17:36:17.302 INFO 12088 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 17:36:17.315 INFO 12088 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 17:36:17.518 INFO 12088 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 17:36:17.628 INFO 12088 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 17:36:17.931 INFO 12088 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 17:36:18.142 INFO 12088 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 17:36:19.252 INFO 12088 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 17:36:19.266 INFO 12088 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 17:36:19.296 INFO 12088 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 17:36:19.838 WARN 12088 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 17:36:20.008 INFO 12088 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 17:36:20.364 INFO 12088 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 17:36:20.380 INFO 12088 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.319 seconds (JVM running for 8.076) -2025-05-20 17:36:27.392 INFO 12088 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 17:36:27.393 INFO 12088 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 17:36:27.397 INFO 12088 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms -2025-05-20 17:36:27.844 INFO 12088 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 17:36:31.506 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 17:36:31.691 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 17:36:31.703 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:33.133 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH -2025-05-20 17:36:33.134 INFO 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:33.168 ERROR 12088 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] -2025-05-20 17:36:33.183 WARN 12088 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.crewmeister.cmcodingchallenge.exception.InvalidRequestException: Unable to retrieve FX rate data. Please try again later.] -2025-05-20 17:36:47.470 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 17:36:47.479 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 17:36:47.481 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:48.190 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGH -2025-05-20 17:36:48.191 INFO 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGH.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:48.263 ERROR 12088 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency BGH: 404 Not Found: [{"title":"A 404 HTTP status code will be returned if there are no results matching the query.","status":404}] -2025-05-20 17:36:48.265 WARN 12088 --- [http-nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.crewmeister.cmcodingchallenge.exception.InvalidRequestException: Unable to retrieve FX rate data. Please try again later.] -2025-05-20 17:36:54.180 INFO 12088 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 17:36:57.481 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 17:36:57.488 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 17:36:57.491 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:58.004 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN -2025-05-20 17:36:58.005 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:58.534 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL -2025-05-20 17:36:58.535 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:59.091 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD -2025-05-20 17:36:59.092 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:36:59.782 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF -2025-05-20 17:36:59.783 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:00.535 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY -2025-05-20 17:37:00.536 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:01.158 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP -2025-05-20 17:37:01.159 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:01.533 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK -2025-05-20 17:37:01.534 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:02.822 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK -2025-05-20 17:37:02.824 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:03.507 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK -2025-05-20 17:37:03.508 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:03.773 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP -2025-05-20 17:37:03.774 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:04.347 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD -2025-05-20 17:37:04.348 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:04.523 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD -2025-05-20 17:37:04.523 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:05.126 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK -2025-05-20 17:37:05.127 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:05.660 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF -2025-05-20 17:37:05.662 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:06.413 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR -2025-05-20 17:37:06.414 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:07.182 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS -2025-05-20 17:37:07.183 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:07.831 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 17:37:07.832 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:08.526 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK -2025-05-20 17:37:08.527 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:09.041 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY -2025-05-20 17:37:09.042 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:09.704 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW -2025-05-20 17:37:09.704 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:10.375 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL -2025-05-20 17:37:10.376 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:10.839 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL -2025-05-20 17:37:10.840 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:11.255 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL -2025-05-20 17:37:11.256 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:11.574 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN -2025-05-20 17:37:11.575 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:12.247 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR -2025-05-20 17:37:12.248 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:12.952 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK -2025-05-20 17:37:12.953 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:13.640 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD -2025-05-20 17:37:13.642 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:14.193 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP -2025-05-20 17:37:14.196 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:14.759 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN -2025-05-20 17:37:14.760 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:15.464 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL -2025-05-20 17:37:15.465 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:15.639 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RON -2025-05-20 17:37:15.640 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:16.101 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB -2025-05-20 17:37:16.102 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:16.654 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK -2025-05-20 17:37:16.655 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:17.234 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD -2025-05-20 17:37:17.235 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:17.892 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT -2025-05-20 17:37:17.893 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:18.096 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK -2025-05-20 17:37:18.098 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:18.429 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: THB -2025-05-20 17:37:18.430 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:18.997 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL -2025-05-20 17:37:18.999 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:19.183 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY -2025-05-20 17:37:19.185 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:19.726 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: USD -2025-05-20 17:37:19.727 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:20.400 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR -2025-05-20 17:37:20.401 INFO 12088 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:37:52.917 WARN 12088 --- [http-nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.crewmeister.cmcodingchallenge.exception.GlobalExceptionHandler#handleIllegalArguments(IllegalArgumentException) - -java.lang.IllegalStateException: Could not resolve parameter [0] in public org.springframework.http.ResponseEntity com.crewmeister.cmcodingchallenge.exception.GlobalExceptionHandler.handleIllegalArguments(java.lang.IllegalArgumentException): No suitable resolver - at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) ~[spring-web-5.3.2.jar:5.3.2] +2025-05-22 16:04:21.937 WARN 16180 --- [http-nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-200.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number]] +2025-05-22 16:04:32.805 ERROR 16180 --- [http-nio-8080-exec-6] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value []; codes [typeMismatch.FXRequestDto.amount,typeMismatch.amount,typeMismatch.double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'double' for property 'amount'; nested exception is java.lang.NumberFormatException: empty String] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:420) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:75) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1321) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1132) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -383,6 +1996,50 @@ java.lang.IllegalStateException: Could not resolve parameter [0] in public org.s at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -393,150 +2050,4388 @@ java.lang.IllegalStateException: Could not resolve parameter [0] in public org.s at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-22 16:04:32.812 WARN 16180 --- [http-nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value []; codes [typeMismatch.FXRequestDto.amount,typeMismatch.amount,typeMismatch.double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'double' for property 'amount'; nested exception is java.lang.NumberFormatException: empty String]] +2025-05-22 16:04:38.471 ERROR 16180 --- [http-nio-8080-exec-5] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + +2025-05-22 16:04:38.475 WARN 16180 --- [http-nio-8080-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null]] +2025-05-22 16:09:37.444 INFO 7076 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 7076 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:09:37.450 DEBUG 7076 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:09:37.451 INFO 7076 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 16:09:37.604 INFO 7076 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 16:09:37.605 INFO 7076 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 16:09:39.265 INFO 7076 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 16:09:39.423 INFO 7076 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 119 ms. Found 2 JPA repository interfaces. +2025-05-22 16:09:40.108 INFO 7076 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$bd9b7d07] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:09:41.003 INFO 7076 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 16:09:41.026 INFO 7076 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 16:09:41.027 INFO 7076 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 16:09:41.202 INFO 7076 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 16:09:41.203 INFO 7076 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3595 ms +2025-05-22 16:09:41.379 INFO 7076 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 16:09:41.656 INFO 7076 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 16:09:41.673 INFO 7076 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 16:09:41.965 INFO 7076 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 16:09:42.052 INFO 7076 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 16:09:42.317 INFO 7076 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 16:09:42.550 INFO 7076 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 16:09:43.526 INFO 7076 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 16:09:43.538 INFO 7076 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 16:09:43.581 INFO 7076 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 16:09:44.403 WARN 7076 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 16:09:44.639 INFO 7076 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@891ba89, org.springframework.security.web.context.SecurityContextPersistenceFilter@6d5bb9c3, org.springframework.security.web.header.HeaderWriterFilter@6beef94c, org.springframework.security.web.authentication.logout.LogoutFilter@6ac23203, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@4c2f5ff4, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@40dd38e9, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@4db5be11, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7c3af82a, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@e241406, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@78426005, org.springframework.security.web.session.SessionManagementFilter@1ed22a73, org.springframework.security.web.access.ExceptionTranslationFilter@46cdc7cb, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@256db431] +2025-05-22 16:09:44.818 INFO 7076 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 16:09:45.186 INFO 7076 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 16:09:45.212 INFO 7076 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 8.625 seconds (JVM running for 9.777) +2025-05-22 16:10:01.226 INFO 7076 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 16:10:01.228 INFO 7076 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 16:10:01.234 INFO 7076 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms +2025-05-22 16:10:01.374 INFO 7076 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:10:06.440 INFO 7076 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 16:10:11.850 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:10:11.909 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 16:10:11.936 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:14.570 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 16:10:14.574 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:16.100 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 16:10:16.103 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:18.083 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 16:10:18.086 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:19.050 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 16:10:19.052 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:19.872 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 16:10:19.874 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:20.498 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 16:10:20.499 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:20.821 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 16:10:20.822 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:21.484 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 16:10:21.485 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:22.163 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 16:10:22.163 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:22.547 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 16:10:22.548 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:23.255 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 16:10:23.256 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:23.446 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 16:10:23.447 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:24.368 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 16:10:24.369 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:25.098 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 16:10:25.099 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:25.952 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 16:10:25.954 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:26.629 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 16:10:26.629 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:27.364 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:10:27.365 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:28.137 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 16:10:28.138 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:28.758 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 16:10:28.759 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:29.468 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 16:10:29.469 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:30.202 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 16:10:30.203 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:30.651 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 16:10:30.652 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:31.068 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 16:10:31.069 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:31.270 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 16:10:31.270 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:32.325 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 16:10:32.326 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:33.151 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 16:10:33.152 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:33.757 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 16:10:33.757 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:34.347 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 16:10:34.348 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:34.963 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 16:10:34.964 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:36.161 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 16:10:36.162 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:36.443 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 16:10:36.444 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:37.137 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 16:10:37.138 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:38.595 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 16:10:38.597 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:40.267 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 16:10:40.272 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:41.728 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 16:10:41.730 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:41.988 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 16:10:41.989 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:42.505 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 16:10:42.507 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:43.127 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 16:10:43.131 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:43.282 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 16:10:43.283 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:43.992 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 16:10:43.993 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:10:44.980 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 16:10:44.981 INFO 7076 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:31.468 INFO 7392 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 7392 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:16:31.474 DEBUG 7392 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:16:31.475 INFO 7392 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 16:16:31.600 INFO 7392 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 16:16:31.601 INFO 7392 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 16:16:33.104 INFO 7392 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 16:16:33.212 INFO 7392 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 92 ms. Found 2 JPA repository interfaces. +2025-05-22 16:16:33.698 INFO 7392 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$d2a74f34] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:16:34.428 INFO 7392 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 16:16:34.445 INFO 7392 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 16:16:34.446 INFO 7392 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 16:16:34.575 INFO 7392 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 16:16:34.576 INFO 7392 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2973 ms +2025-05-22 16:16:34.649 INFO 7392 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 16:16:34.857 INFO 7392 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 16:16:34.873 INFO 7392 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 16:16:35.079 INFO 7392 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 16:16:35.184 INFO 7392 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 16:16:35.446 INFO 7392 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 16:16:35.629 INFO 7392 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 16:16:36.690 INFO 7392 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 16:16:36.705 INFO 7392 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 16:16:36.734 INFO 7392 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 16:16:37.530 WARN 7392 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 16:16:37.755 INFO 7392 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7fe5d08c, org.springframework.security.web.context.SecurityContextPersistenceFilter@25442983, org.springframework.security.web.header.HeaderWriterFilter@6d5bb9c3, org.springframework.security.web.authentication.logout.LogoutFilter@51a4b19a, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@891ba89, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@6dea8e24, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@1fc0ac57, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5b59d598, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4459fc36, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@74e9a5e2, org.springframework.security.web.session.SessionManagementFilter@7c3af82a, org.springframework.security.web.access.ExceptionTranslationFilter@6beef94c, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@16480846] +2025-05-22 16:16:37.951 INFO 7392 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 16:16:38.322 INFO 7392 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 16:16:38.338 INFO 7392 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.818 seconds (JVM running for 8.888) +2025-05-22 16:16:44.067 INFO 7392 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 16:16:44.068 INFO 7392 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 16:16:44.070 INFO 7392 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2025-05-22 16:16:44.165 INFO 7392 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:16:48.852 INFO 7392 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 16:16:50.902 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:16:50.919 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 16:16:50.929 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:52.471 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 16:16:52.472 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:53.844 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 16:16:53.850 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:54.894 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 16:16:54.896 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:55.605 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 16:16:55.606 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:56.298 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 16:16:56.299 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:57.140 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 16:16:57.142 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:57.519 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 16:16:57.520 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:58.317 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 16:16:58.319 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:59.095 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 16:16:59.096 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:16:59.650 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 16:16:59.651 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:00.368 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 16:17:00.369 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:00.549 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 16:17:00.551 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:01.428 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 16:17:01.429 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:01.966 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 16:17:01.967 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:02.775 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 16:17:02.777 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:03.414 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 16:17:03.415 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:04.023 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:17:04.024 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:04.606 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 16:17:04.607 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:05.069 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 16:17:05.070 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:06.018 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 16:17:06.020 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:06.681 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 16:17:06.682 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:07.152 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 16:17:07.153 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:07.381 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 16:17:07.381 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:07.533 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 16:17:07.534 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:08.277 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 16:17:08.278 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:09.160 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 16:17:09.161 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:09.726 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 16:17:09.726 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:10.201 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 16:17:10.202 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:10.622 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 16:17:10.623 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:11.075 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 16:17:11.076 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:11.219 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 16:17:11.221 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:11.594 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 16:17:11.594 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:11.972 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 16:17:11.972 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:12.389 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 16:17:12.390 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:12.810 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 16:17:12.810 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:12.947 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 16:17:12.948 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:13.138 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 16:17:13.138 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:13.953 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 16:17:13.954 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:14.102 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 16:17:14.103 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:14.523 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 16:17:14.523 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:17:15.084 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 16:17:15.085 INFO 7392 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:22:12.581 INFO 5848 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 5848 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:22:12.586 DEBUG 5848 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:22:12.587 INFO 5848 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 16:22:12.701 INFO 5848 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 16:22:12.701 INFO 5848 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 16:22:13.899 INFO 5848 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 16:22:14.002 INFO 5848 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 88 ms. Found 2 JPA repository interfaces. +2025-05-22 16:22:14.481 INFO 5848 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$167d0a3f] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:22:15.214 INFO 5848 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 16:22:15.229 INFO 5848 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 16:22:15.230 INFO 5848 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 16:22:15.362 INFO 5848 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 16:22:15.363 INFO 5848 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2659 ms +2025-05-22 16:22:15.443 INFO 5848 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 16:22:15.625 INFO 5848 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 16:22:15.636 INFO 5848 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 16:22:15.806 INFO 5848 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 16:22:15.898 INFO 5848 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 16:22:16.146 INFO 5848 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 16:22:16.326 INFO 5848 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 16:22:17.318 INFO 5848 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 16:22:17.332 INFO 5848 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 16:22:17.373 INFO 5848 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 16:22:18.137 WARN 5848 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 16:22:18.388 INFO 5848 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2b2345be, org.springframework.security.web.context.SecurityContextPersistenceFilter@3bd60060, org.springframework.security.web.header.HeaderWriterFilter@1fc0cb3e, org.springframework.security.web.authentication.logout.LogoutFilter@68dd6dc6, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3fdc02ce, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@44b10e59, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@37d7bd43, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@52b3b469, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1a009ea2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@331ebff2, org.springframework.security.web.session.SessionManagementFilter@6c443dd5, org.springframework.security.web.access.ExceptionTranslationFilter@457f8166, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@5498292] +2025-05-22 16:22:18.571 INFO 5848 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 16:22:19.052 INFO 5848 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 16:22:19.075 INFO 5848 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.318 seconds (JVM running for 8.113) +2025-05-22 16:25:08.604 INFO 13108 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 13108 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:25:08.609 DEBUG 13108 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:25:08.611 INFO 13108 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 16:25:08.712 INFO 13108 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 16:25:08.715 INFO 13108 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 16:25:10.080 INFO 13108 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 16:25:10.183 INFO 13108 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 88 ms. Found 2 JPA repository interfaces. +2025-05-22 16:25:10.672 INFO 13108 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$d6174b58] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:25:11.400 INFO 13108 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 16:25:11.417 INFO 13108 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 16:25:11.417 INFO 13108 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 16:25:11.541 INFO 13108 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 16:25:11.542 INFO 13108 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2824 ms +2025-05-22 16:25:11.615 INFO 13108 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 16:25:11.806 INFO 13108 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 16:25:11.817 INFO 13108 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 16:25:11.993 INFO 13108 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 16:25:12.077 INFO 13108 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 16:25:12.309 INFO 13108 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 16:25:12.491 INFO 13108 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 16:25:13.880 INFO 13108 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 16:25:13.897 INFO 13108 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 16:25:13.934 INFO 13108 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 16:25:14.717 WARN 13108 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 16:25:14.973 INFO 13108 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4367a233, org.springframework.security.web.context.SecurityContextPersistenceFilter@63cfae51, org.springframework.security.web.header.HeaderWriterFilter@454387de, org.springframework.security.web.authentication.logout.LogoutFilter@7b5cee87, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@7077c0c6, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@2cebc68, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@418331e1, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1049d4d7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@66719252, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7560fbd8, org.springframework.security.web.session.SessionManagementFilter@75344186, org.springframework.security.web.access.ExceptionTranslationFilter@2256b62f, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@a01d982] +2025-05-22 16:25:15.198 INFO 13108 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 16:25:15.547 INFO 13108 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 16:25:15.562 INFO 13108 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.68 seconds (JVM running for 8.6) +2025-05-22 16:25:27.534 INFO 13108 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 16:25:27.536 INFO 13108 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 16:25:27.539 INFO 13108 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-05-22 16:25:27.639 INFO 13108 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:25:33.660 INFO 13108 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 16:25:36.747 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:25:36.777 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 16:25:36.867 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:39.791 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 16:25:39.792 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:40.677 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 16:25:40.678 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:41.235 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 16:25:41.235 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:42.707 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 16:25:42.709 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:44.460 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 16:25:44.461 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:45.047 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 16:25:45.047 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:45.404 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 16:25:45.405 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:46.291 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 16:25:46.292 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:47.196 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 16:25:47.198 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:47.705 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 16:25:47.707 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:48.391 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 16:25:48.392 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:48.532 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 16:25:48.532 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:49.286 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 16:25:49.286 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:49.839 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 16:25:49.840 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:50.729 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 16:25:50.732 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:51.395 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 16:25:51.395 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:52.111 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:25:52.111 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:52.766 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 16:25:52.767 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:53.395 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 16:25:53.396 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:54.080 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 16:25:54.081 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:54.664 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 16:25:54.664 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:55.168 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 16:25:55.169 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:55.605 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 16:25:55.606 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:55.815 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 16:25:55.816 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:56.435 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 16:25:56.436 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:57.302 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 16:25:57.303 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:58.464 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 16:25:58.467 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:25:59.446 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 16:25:59.447 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:00.684 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 16:26:00.686 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:01.859 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 16:26:01.860 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:02.177 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 16:26:02.178 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:02.911 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 16:26:02.912 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:03.855 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 16:26:03.856 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:04.695 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 16:26:04.698 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:05.489 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 16:26:05.490 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:05.958 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 16:26:05.958 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:06.440 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 16:26:06.441 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:07.471 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 16:26:07.472 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:07.650 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 16:26:07.651 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:08.238 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 16:26:08.240 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:26:08.995 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 16:26:08.996 INFO 13108 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:38.747 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:30:38.791 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 16:30:38.794 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:39.589 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 16:30:39.590 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:40.074 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 16:30:40.075 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:40.535 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 16:30:40.538 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:40.975 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 16:30:40.976 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:41.601 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 16:30:41.602 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:42.126 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 16:30:42.127 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:42.447 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 16:30:42.449 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:43.237 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 16:30:43.238 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:43.633 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 16:30:43.634 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:43.899 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 16:30:43.900 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:44.661 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 16:30:44.662 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:44.834 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 16:30:44.834 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:46.008 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 16:30:46.009 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:46.526 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 16:30:46.527 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:47.230 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 16:30:47.231 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:47.727 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 16:30:47.727 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:48.289 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:30:48.290 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:48.893 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 16:30:48.894 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:49.396 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 16:30:49.397 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:50.020 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 16:30:50.021 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:50.546 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 16:30:50.547 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:51.032 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 16:30:51.033 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:51.488 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 16:30:51.489 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:51.707 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 16:30:51.708 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:52.349 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 16:30:52.350 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:53.017 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 16:30:53.018 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:53.586 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 16:30:53.587 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:53.970 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 16:30:53.971 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:54.358 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 16:30:54.359 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:54.771 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 16:30:54.772 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:54.928 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 16:30:54.929 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:55.438 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 16:30:55.438 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:55.920 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 16:30:55.920 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:56.542 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 16:30:56.542 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:57.125 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 16:30:57.126 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:57.372 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 16:30:57.373 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:57.760 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 16:30:57.761 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:58.314 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 16:30:58.316 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:58.596 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 16:30:58.597 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:59.043 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 16:30:59.044 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:30:59.908 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 16:30:59.909 INFO 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:31:03.518 ERROR 13108 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Failed to fetch data from Bundesbank for currency ZAR: Error while extracting response for type [class com.crewmeister.cmcodingchallenge.xmldata.GenericData] and content type [application/vnd.sdmx.genericdata+xml;version=2.1;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Connection reset; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Connection reset + at [Source: (PushbackInputStream); line: 1, column: 1404829] (through reference chain: com.crewmeister.cmcodingchallenge.xmldata.GenericData["DataSet"]->com.crewmeister.cmcodingchallenge.xmldata.DataSet["Series"]->com.crewmeister.cmcodingchallenge.xmldata.Series["Obs"]) +2025-05-22 16:31:03.538 WARN 13108 --- [http-nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.crewmeister.cmcodingchallenge.exception.InvalidRequestException: Unable to retrieve FX rate data, please check logs for more details] +2025-05-22 16:32:56.038 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 16:32:56.223 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 16:32:56.236 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:32:57.332 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 16:32:57.333 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:32:58.246 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 16:32:58.249 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:32:58.823 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 16:32:58.823 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:32:59.383 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 16:32:59.384 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:32:59.797 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 16:32:59.797 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:00.232 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 16:33:00.232 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:00.452 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 16:33:00.453 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:01.089 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 16:33:01.089 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:01.556 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 16:33:01.557 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:01.744 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 16:33:01.744 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:02.282 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 16:33:02.283 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:02.416 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 16:33:02.416 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:02.806 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 16:33:02.806 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:03.146 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 16:33:03.146 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:03.534 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 16:33:03.534 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:03.933 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 16:33:03.933 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:04.297 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 16:33:04.297 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:04.666 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 16:33:04.666 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:05.036 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 16:33:05.037 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:05.571 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 16:33:05.572 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:06.070 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 16:33:06.071 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:06.308 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 16:33:06.309 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:06.564 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 16:33:06.564 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:06.735 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 16:33:06.735 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:07.104 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 16:33:07.104 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:07.481 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 16:33:07.481 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:07.853 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 16:33:07.854 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:08.240 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 16:33:08.241 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:08.615 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 16:33:08.615 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:08.990 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 16:33:08.990 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:09.087 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 16:33:09.088 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:09.499 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 16:33:09.499 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:09.966 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 16:33:09.967 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:10.340 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 16:33:10.341 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:10.711 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 16:33:10.711 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:10.849 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 16:33:10.849 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:11.084 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 16:33:11.085 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:11.606 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 16:33:11.606 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:11.763 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 16:33:11.763 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:12.226 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 16:33:12.227 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:33:12.943 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 16:33:12.943 INFO 13108 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 16:44:25.301 INFO 2296 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 2296 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:44:25.310 DEBUG 2296 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:44:25.316 INFO 2296 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 16:44:29.735 INFO 2296 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$6c3a44c7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:44:30.159 WARN 2296 --- [main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} +2025-05-22 16:44:30.174 INFO 2296 --- [main] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-05-22 16:44:30.229 ERROR 2296 --- [main] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Field userDetailsService in com.crewmeister.cmcodingchallenge.security.SecurityConfig required a bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' that could not be found. + +The injection point has the following annotations: + - @org.springframework.beans.factory.annotation.Autowired(required=true) + + +Action: + +Consider defining a bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' in your configuration. + +2025-05-22 16:44:30.244 ERROR 2296 --- [main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@68f4865] to prepare test instance [com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests@66e21568] + +java.lang.IllegalStateException: Failed to load ApplicationContext + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:105) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:89) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener.java:56) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:137) ~[spring-test-5.3.2.jar:5.3.2] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:350) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:355) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$7(ClassBasedTestDescriptor.java:350) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na] + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na] + at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312) ~[na:na] + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) ~[na:na] + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:349) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$4(ClassBasedTestDescriptor.java:270) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:269) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:259) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at java.base/java.util.Optional.orElseGet(Optional.java:369) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:258) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:101) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:100) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:111) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:111) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:79) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:122) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.3.2.jar:5.3.2] + ... 70 common frames omitted +Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1777) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.2.jar:5.3.2] + ... 89 common frames omitted + +2025-05-22 16:49:50.180 INFO 10424 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 10424 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:49:50.195 DEBUG 10424 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:49:50.227 INFO 10424 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 16:49:54.100 INFO 10424 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$e415b718] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:49:54.440 WARN 10424 --- [main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} +2025-05-22 16:49:54.453 INFO 10424 --- [main] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-05-22 16:49:54.491 ERROR 10424 --- [main] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Field userDetailsService in com.crewmeister.cmcodingchallenge.security.SecurityConfig required a bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' that could not be found. + +The injection point has the following annotations: + - @org.springframework.beans.factory.annotation.Autowired(required=true) + + +Action: + +Consider defining a bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' in your configuration. + +2025-05-22 16:49:54.505 ERROR 10424 --- [main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@40317ba2] to prepare test instance [com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests@7573b9ee] + +java.lang.IllegalStateException: Failed to load ApplicationContext + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:105) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:89) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener.java:56) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:137) ~[spring-test-5.3.2.jar:5.3.2] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:350) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:355) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$7(ClassBasedTestDescriptor.java:350) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na] + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na] + at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312) ~[na:na] + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) ~[na:na] + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:349) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$4(ClassBasedTestDescriptor.java:270) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:269) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:259) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at java.base/java.util.Optional.orElseGet(Optional.java:369) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:258) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:101) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:100) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:111) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:111) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:79) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:122) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.3.2.jar:5.3.2] + ... 70 common frames omitted +Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.crewmeister.cmcodingchallenge.security.MyUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1777) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.2.jar:5.3.2] + ... 89 common frames omitted + +2025-05-22 16:53:08.062 INFO 12416 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12416 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:53:08.067 DEBUG 12416 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:53:08.077 INFO 12416 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 16:53:12.461 INFO 12416 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$d8ed45a0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:53:12.936 WARN 12416 --- [main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'passwordEncoder'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.crypto.password.PasswordEncoder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} +2025-05-22 16:53:12.965 INFO 12416 --- [main] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-05-22 16:53:13.179 ERROR 12416 --- [main] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Field passwordEncoder in com.crewmeister.cmcodingchallenge.security.SecurityConfig required a bean of type 'org.springframework.security.crypto.password.PasswordEncoder' that could not be found. + +The injection point has the following annotations: + - @org.springframework.beans.factory.annotation.Autowired(required=true) + + +Action: + +Consider defining a bean of type 'org.springframework.security.crypto.password.PasswordEncoder' in your configuration. + +2025-05-22 16:53:13.197 ERROR 12416 --- [main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@5b7a8434] to prepare test instance [com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests@515b9d4a] + +java.lang.IllegalStateException: Failed to load ApplicationContext + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:105) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:89) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener.java:56) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:137) ~[spring-test-5.3.2.jar:5.3.2] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:350) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:355) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$7(ClassBasedTestDescriptor.java:350) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) ~[na:na] + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na] + at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312) ~[na:na] + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) ~[na:na] + at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:349) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$4(ClassBasedTestDescriptor.java:270) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:269) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:259) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at java.base/java.util.Optional.orElseGet(Optional.java:369) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:258) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:101) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:100) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:111) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:111) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:79) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'passwordEncoder'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.crypto.password.PasswordEncoder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.2.jar:5.3.2] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.1.jar:2.4.1] + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:122) ~[spring-boot-test-2.4.1.jar:2.4.1] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.3.2.jar:5.3.2] + ... 70 common frames omitted +Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.crypto.password.PasswordEncoder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1777) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1333) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287) ~[spring-beans-5.3.2.jar:5.3.2] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.2.jar:5.3.2] + ... 89 common frames omitted + +2025-05-22 16:54:42.295 INFO 9568 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 9568 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:54:42.299 DEBUG 9568 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:54:42.311 INFO 9568 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 16:54:46.384 INFO 9568 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$d701129c] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:54:48.152 INFO 9568 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@582e9152, org.springframework.security.web.context.SecurityContextPersistenceFilter@339f3a55, org.springframework.security.web.header.HeaderWriterFilter@296edc75, org.springframework.security.web.authentication.logout.LogoutFilter@7ab2a07e, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3520958b, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@426131d7, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@7a31ca20, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@209f3887, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3830b06c, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@349c4d1c, org.springframework.security.web.session.SessionManagementFilter@6d0290d8, org.springframework.security.web.access.ExceptionTranslationFilter@19f02280, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7abeabe9] +2025-05-22 16:54:48.760 INFO 9568 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 16:54:49.371 INFO 9568 --- [main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet '' +2025-05-22 16:54:49.372 INFO 9568 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet '' +2025-05-22 16:54:49.375 INFO 9568 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 2 ms +2025-05-22 16:54:49.437 INFO 9568 --- [main] c.c.c.c.CurrencyControllerTests : Started CurrencyControllerTests in 8.649 seconds (JVM running for 12.559) +2025-05-22 16:54:49.726 INFO 9568 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 16:56:44.977 INFO 12916 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12916 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:56:44.982 DEBUG 12916 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:56:45.003 INFO 12916 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 16:56:49.046 INFO 12916 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$c051c43d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:56:50.445 INFO 12916 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@76cdafa3, org.springframework.security.web.context.SecurityContextPersistenceFilter@49580ca8, org.springframework.security.web.header.HeaderWriterFilter@426131d7, org.springframework.security.web.authentication.logout.LogoutFilter@56a4abd0, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@60b5e80d, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@280fafd, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@6b27b2d0, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@20a24edf, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@77524ca7, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4fb64e14, org.springframework.security.web.session.SessionManagementFilter@13cc0b90, org.springframework.security.web.access.ExceptionTranslationFilter@339f3a55, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@1c98b4eb] +2025-05-22 16:56:51.194 INFO 12916 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 16:56:51.925 INFO 12916 --- [main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet '' +2025-05-22 16:56:51.926 INFO 12916 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet '' +2025-05-22 16:56:51.929 INFO 12916 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 2 ms +2025-05-22 16:56:52.003 INFO 12916 --- [main] c.c.c.c.CurrencyControllerTests : Started CurrencyControllerTests in 8.332 seconds (JVM running for 11.343) +2025-05-22 16:56:53.488 INFO 12916 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 16:58:01.172 INFO 17372 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 17372 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 16:58:01.176 DEBUG 17372 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 16:58:01.180 INFO 17372 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 16:58:05.550 INFO 17372 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$c051c43d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 16:58:07.234 INFO 17372 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@b5aa65b, org.springframework.security.web.context.SecurityContextPersistenceFilter@3a3b10f4, org.springframework.security.web.header.HeaderWriterFilter@3a0aaaf0, org.springframework.security.web.authentication.logout.LogoutFilter@69ed5ea2, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@2fd39436, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@6af609ea, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@76cdafa3, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@42fc4ac4, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@35145874, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6b27b2d0, org.springframework.security.web.session.SessionManagementFilter@7c7e73c5, org.springframework.security.web.access.ExceptionTranslationFilter@4ae2e781, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7f27f59b] +2025-05-22 16:58:07.865 INFO 17372 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 16:58:08.460 INFO 17372 --- [main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet '' +2025-05-22 16:58:08.461 INFO 17372 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet '' +2025-05-22 16:58:08.464 INFO 17372 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 2 ms +2025-05-22 16:58:08.522 INFO 17372 --- [main] c.c.c.c.CurrencyControllerTests : Started CurrencyControllerTests in 8.779 seconds (JVM running for 12.019) +2025-05-22 16:58:09.481 INFO 17372 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 17:01:20.618 INFO 17228 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 17228 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:01:20.623 DEBUG 17228 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:01:20.647 INFO 17228 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 17:01:24.864 INFO 17228 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$2b234e1b] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:01:26.897 INFO 17228 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@391515c7, org.springframework.security.web.context.SecurityContextPersistenceFilter@3a0aaaf0, org.springframework.security.web.header.HeaderWriterFilter@6a2d867d, org.springframework.security.web.authentication.logout.LogoutFilter@361cd35c, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@689faf79, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@43a4a9e5, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@5b0dbfb, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7c7e73c5, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@20a24edf, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4b9dbf07, org.springframework.security.web.session.SessionManagementFilter@3830b06c, org.springframework.security.web.access.ExceptionTranslationFilter@5db948c9, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@69796bd0] +2025-05-22 17:01:27.673 INFO 17228 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:01:28.288 INFO 17228 --- [main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet '' +2025-05-22 17:01:28.289 INFO 17228 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet '' +2025-05-22 17:01:28.292 INFO 17228 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 3 ms +2025-05-22 17:01:28.348 INFO 17228 --- [main] c.c.c.c.CurrencyControllerTests : Started CurrencyControllerTests in 9.01 seconds (JVM running for 12.003) +2025-05-22 17:01:28.645 INFO 17228 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:01:28.740 INFO 17228 --- [main] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:01:28.793 INFO 17228 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:01:29.121 ERROR 17228 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [null]; codes [NotNull.FXRequestDto.date,NotNull.date,NotNull.java.time.LocalDate,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Date is required] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullDateInput(CurrencyControllerTests.java:212) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:01:29.301 ERROR 17228 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character (']' (code 93)): expected a value; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:285) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:243) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:205) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testAddCurrencyWithInvalidInputCurrencies(CurrencyControllerTests.java:61) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] +Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]) + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:356) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1726) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:373) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3521) ~[jackson-databind-2.11.3.jar:2.11.3] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:274) ~[spring-web-5.3.2.jar:5.3.2] + ... 142 common frames omitted +Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] + at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1851) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:707) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:632) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2653) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:865) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:757) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:281) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:371) ~[jackson-databind-2.11.3.jar:2.11.3] + ... 146 common frames omitted + +2025-05-22 17:01:29.346 ERROR 17228 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [0.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithZeroAmountInput(CurrencyControllerTests.java:268) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:01:29.365 INFO 17228 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:01:29.389 ERROR 17228 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [16-05-2025]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '16-05-2025'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [16-05-2025]] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithInValidDateInput(CurrencyControllerTests.java:246) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:01:29.411 ERROR 17228 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithInValidCurrencyInput(CurrencyControllerTests.java:257) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:01:29.469 ERROR 17228 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value []; codes [typeMismatch.FXRequestDto.amount,typeMismatch.amount,typeMismatch.double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'double' for property 'amount'; nested exception is java.lang.NumberFormatException: empty String] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullAmountInput(CurrencyControllerTests.java:235) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:01:29.681 INFO 17228 --- [main] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:01:29.707 INFO 17228 --- [main] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@2b2b7e3c +2025-05-22 17:01:29.737 INFO 17228 --- [main] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:01:29.761 ERROR 17228 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-500.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNegativeAmountInput(CurrencyControllerTests.java:280) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:01:29.781 INFO 17228 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:01:29.831 INFO 17228 --- [main] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:01:29.859 INFO 17228 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 17:02:38.548 INFO 13296 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 13296 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:02:38.553 DEBUG 13296 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:02:38.567 INFO 13296 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 17:02:42.598 INFO 13296 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$1ebe0129] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:02:44.265 INFO 13296 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@a2b54e3, org.springframework.security.web.context.SecurityContextPersistenceFilter@29962b2f, org.springframework.security.web.header.HeaderWriterFilter@58687fb7, org.springframework.security.web.authentication.logout.LogoutFilter@269222ae, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@4d518c66, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@4b03cbad, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@5c4cc644, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5b733ef7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6af609ea, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@21f7e537, org.springframework.security.web.session.SessionManagementFilter@49580ca8, org.springframework.security.web.access.ExceptionTranslationFilter@6a98f353, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6cc64028] +2025-05-22 17:02:45.153 INFO 13296 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:02:45.981 INFO 13296 --- [main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet '' +2025-05-22 17:02:45.982 INFO 13296 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet '' +2025-05-22 17:02:45.985 INFO 13296 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 2 ms +2025-05-22 17:02:46.049 INFO 13296 --- [main] c.c.c.c.CurrencyControllerTests : Started CurrencyControllerTests in 8.771 seconds (JVM running for 11.696) +2025-05-22 17:02:46.414 INFO 13296 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:02:46.529 INFO 13296 --- [main] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:02:46.597 INFO 13296 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:02:47.089 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [null]; codes [NotNull.FXRequestDto.date,NotNull.date,NotNull.java.time.LocalDate,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Date is required] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullDateInput(CurrencyControllerTests.java:212) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:02:47.333 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character (']' (code 93)): expected a value; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:285) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:243) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:205) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testAddCurrencyWithInvalidInputCurrencies(CurrencyControllerTests.java:61) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] +Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]) + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:356) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1726) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:373) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3521) ~[jackson-databind-2.11.3.jar:2.11.3] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:274) ~[spring-web-5.3.2.jar:5.3.2] + ... 142 common frames omitted +Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] + at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1851) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:707) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:632) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2653) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:865) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:757) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:281) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:371) ~[jackson-databind-2.11.3.jar:2.11.3] + ... 146 common frames omitted + +2025-05-22 17:02:47.386 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [0.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithZeroAmountInput(CurrencyControllerTests.java:268) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:02:47.435 INFO 13296 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:02:47.464 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [16-05-2025]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '16-05-2025'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [16-05-2025]] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithInValidDateInput(CurrencyControllerTests.java:246) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:02:47.499 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithInValidCurrencyInput(CurrencyControllerTests.java:257) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:02:47.575 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value []; codes [typeMismatch.FXRequestDto.amount,typeMismatch.amount,typeMismatch.double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'double' for property 'amount'; nested exception is java.lang.NumberFormatException: empty String] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullAmountInput(CurrencyControllerTests.java:235) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:02:47.884 INFO 13296 --- [main] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:02:47.917 INFO 13296 --- [main] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@28519bfb +2025-05-22 17:02:47.957 INFO 13296 --- [main] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:02:47.988 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-500.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNegativeAmountInput(CurrencyControllerTests.java:280) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:02:48.013 INFO 13296 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:02:48.038 ERROR 13296 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [null]; codes [NotNull.FXRequestDto.currency,NotNull.currency,NotNull.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Currency is required] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullCurrencyInput(CurrencyControllerTests.java:224) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:02:48.056 INFO 13296 --- [main] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:02:48.093 INFO 13296 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 17:05:27.934 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12576 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:05:27.939 DEBUG 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:05:27.940 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 17:05:28.040 INFO 12576 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 17:05:28.041 INFO 12576 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 17:05:29.317 INFO 12576 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 17:05:29.420 INFO 12576 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 89 ms. Found 2 JPA repository interfaces. +2025-05-22 17:05:29.928 INFO 12576 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$b0c2adfc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:05:30.707 INFO 12576 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 17:05:30.725 INFO 12576 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 17:05:30.725 INFO 12576 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 17:05:30.859 INFO 12576 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 17:05:30.860 INFO 12576 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2817 ms +2025-05-22 17:05:30.934 INFO 12576 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 17:05:31.115 INFO 12576 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 17:05:31.125 INFO 12576 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 17:05:31.343 INFO 12576 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 17:05:31.452 INFO 12576 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 17:05:31.691 INFO 12576 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 17:05:31.872 INFO 12576 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 17:05:32.940 INFO 12576 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 17:05:32.966 INFO 12576 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 17:05:33.004 INFO 12576 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 17:05:33.927 WARN 12576 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 17:05:34.164 INFO 12576 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7c45a479, org.springframework.security.web.context.SecurityContextPersistenceFilter@7fa6c1f5, org.springframework.security.web.header.HeaderWriterFilter@10395dab, org.springframework.security.web.authentication.logout.LogoutFilter@b27d78b, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@6bf12bcf, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@542d556c, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@1479ba3c, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@720c8832, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@361fbec1, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@490309a8, org.springframework.security.web.session.SessionManagementFilter@5bdf9336, org.springframework.security.web.access.ExceptionTranslationFilter@20d9757c, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@231bf5d2] +2025-05-22 17:05:34.372 INFO 12576 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:05:34.719 INFO 12576 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 17:05:34.736 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.876 seconds (JVM running for 8.702) +2025-05-22 17:06:01.409 INFO 12576 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 17:06:01.410 INFO 12576 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 17:06:01.413 INFO 12576 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-05-22 17:06:01.643 INFO 12576 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:06:01.692 WARN 12576 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.IllegalArgumentException: Currency list must not be null or empty] +2025-05-22 17:06:09.682 ERROR 12576 --- [http-nio-8080-exec-2] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character (',' (code 44)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (',' (code 44)): was expecting double-quote to start field name + at [Source: (PushbackInputStream); line: 4, column: 20] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]->java.util.ArrayList[0]) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:285) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:243) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:205) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] +Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (',' (code 44)): was expecting double-quote to start field name + at [Source: (PushbackInputStream); line: 4, column: 20] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]->java.util.ArrayList[0]) + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:368) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:306) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:371) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3521) ~[jackson-databind-2.11.3.jar:2.11.3] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:274) ~[spring-web-5.3.2.jar:5.3.2] + ... 95 common frames omitted +Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (',' (code 44)): was expecting double-quote to start field name + at [Source: (PushbackInputStream); line: 4, column: 20] + at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1851) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:707) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:632) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleOddName(UTF8StreamJsonParser.java:2049) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._parseName(UTF8StreamJsonParser.java:1700) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextFieldName(UTF8StreamJsonParser.java:1038) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:378) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:290) ~[jackson-databind-2.11.3.jar:2.11.3] + ... 103 common frames omitted + +2025-05-22 17:06:09.691 WARN 12576 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character (',' (code 44)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (',' (code 44)): was expecting double-quote to start field name + at [Source: (PushbackInputStream); line: 4, column: 20] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]->java.util.ArrayList[0])] +2025-05-22 17:06:15.843 INFO 12576 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:06:25.705 INFO 12576 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:06:41.395 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:06:41.411 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 17:06:41.512 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:43.602 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 17:06:43.603 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:44.244 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 17:06:44.244 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:44.902 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 17:06:44.903 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:45.552 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 17:06:45.552 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:46.341 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 17:06:46.341 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:46.977 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 17:06:46.978 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:47.310 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 17:06:47.311 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:48.092 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 17:06:48.093 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:50.048 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 17:06:50.049 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:50.506 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 17:06:50.507 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:51.155 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 17:06:51.155 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:51.313 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 17:06:51.314 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:51.936 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 17:06:51.937 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:52.481 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 17:06:52.481 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:53.201 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 17:06:53.202 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:54.025 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 17:06:54.026 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:54.815 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 17:06:54.816 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:55.453 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 17:06:55.454 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:56.022 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 17:06:56.023 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:56.705 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 17:06:56.705 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:57.273 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 17:06:57.274 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:57.772 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 17:06:57.773 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:58.146 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 17:06:58.147 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:58.410 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 17:06:58.411 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:59.047 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 17:06:59.048 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:06:59.733 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 17:06:59.733 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:00.300 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 17:07:00.300 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:00.974 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 17:07:00.974 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:01.543 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 17:07:01.543 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:02.123 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 17:07:02.124 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:02.359 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 17:07:02.360 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:02.882 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 17:07:02.883 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:03.422 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 17:07:03.423 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:04.139 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 17:07:04.140 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:04.794 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 17:07:04.794 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:05.068 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 17:07:05.068 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:05.410 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 17:07:05.411 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:06.105 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 17:07:06.106 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:06.278 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 17:07:06.278 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:06.722 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 17:07:06.723 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:07.452 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 17:07:07.453 INFO 12576 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:52.843 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:07:52.959 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 17:07:52.967 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:54.348 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 17:07:54.351 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:55.285 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 17:07:55.291 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:56.017 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 17:07:56.018 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:56.682 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 17:07:56.684 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:57.103 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 17:07:57.104 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:57.493 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 17:07:57.494 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:57.666 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 17:07:57.667 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:58.239 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 17:07:58.240 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:58.824 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 17:07:58.826 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:59.015 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 17:07:59.016 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:59.646 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 17:07:59.647 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:07:59.855 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 17:07:59.856 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:00.489 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 17:08:00.490 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:01.190 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 17:08:01.191 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:02.520 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 17:08:02.521 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:03.596 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 17:08:03.597 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:04.284 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 17:08:04.285 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:05.010 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 17:08:05.011 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:06.047 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 17:08:06.049 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:06.803 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 17:08:06.804 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:07.549 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 17:08:07.551 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:07.980 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 17:08:07.980 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:08.435 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 17:08:08.436 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:08.687 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 17:08:08.688 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:09.319 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 17:08:09.320 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:10.056 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 17:08:10.057 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:10.750 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 17:08:10.750 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:11.463 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 17:08:11.464 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:12.057 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 17:08:12.058 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:12.838 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 17:08:12.838 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:13.202 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 17:08:13.207 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:14.601 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 17:08:14.602 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:15.161 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 17:08:15.162 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:15.795 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 17:08:15.796 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:16.504 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 17:08:16.505 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:16.769 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 17:08:16.770 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:17.027 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 17:08:17.028 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:17.691 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 17:08:17.692 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:17.962 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 17:08:17.963 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:18.436 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 17:08:18.437 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:19.097 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 17:08:19.098 INFO 12576 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:08:32.743 WARN 12576 --- [http-nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '22'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [22]] +2025-05-22 17:11:29.546 INFO 12576 --- [Thread-4] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 17:11:29.735 INFO 12576 --- [Thread-4] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 17:11:30.174 WARN 12576 --- [Thread-4] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method failed on bean with name 'inMemoryDatabaseShutdownExecutor': org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] +2025-05-22 17:11:30.181 INFO 12576 --- [Thread-4] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-05-22 17:11:30.211 INFO 12576 --- [Thread-4] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-05-22 17:11:31.378 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12576 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:11:31.378 DEBUG 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:11:31.380 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 17:11:32.229 INFO 12576 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 17:11:32.288 INFO 12576 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 56 ms. Found 2 JPA repository interfaces. +2025-05-22 17:11:32.469 INFO 12576 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$b0c2adfc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:11:32.601 INFO 12576 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 17:11:32.604 INFO 12576 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 17:11:32.605 INFO 12576 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 17:11:32.668 INFO 12576 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 17:11:32.668 INFO 12576 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1276 ms +2025-05-22 17:11:32.748 INFO 12576 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting... +2025-05-22 17:11:32.758 INFO 12576 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed. +2025-05-22 17:11:32.759 INFO 12576 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 17:11:32.834 INFO 12576 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 17:11:32.855 INFO 12576 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 17:11:33.009 INFO 12576 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 17:11:33.010 INFO 12576 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 17:11:33.025 INFO 12576 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 17:11:33.315 WARN 12576 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 17:11:33.386 INFO 12576 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5d5ef130, org.springframework.security.web.context.SecurityContextPersistenceFilter@44bbf95d, org.springframework.security.web.header.HeaderWriterFilter@36bd0da9, org.springframework.security.web.authentication.logout.LogoutFilter@6542c83b, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@10c74c8b, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@12368652, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@4f375309, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1f4e7797, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4140e192, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1b98439a, org.springframework.security.web.session.SessionManagementFilter@5570cab2, org.springframework.security.web.access.ExceptionTranslationFilter@37ad8075, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2e2f5a97] +2025-05-22 17:11:33.506 INFO 12576 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:11:33.678 INFO 12576 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 17:11:33.690 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 2.461 seconds (JVM running for 367.656) +2025-05-22 17:11:33.695 INFO 12576 --- [restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged +2025-05-22 17:11:35.708 INFO 12576 --- [Thread-8] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 17:11:35.714 INFO 12576 --- [Thread-8] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 17:11:35.927 WARN 12576 --- [Thread-8] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method failed on bean with name 'inMemoryDatabaseShutdownExecutor': org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-200] +2025-05-22 17:11:35.928 INFO 12576 --- [Thread-8] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Shutdown initiated... +2025-05-22 17:11:35.931 INFO 12576 --- [Thread-8] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Shutdown completed. +2025-05-22 17:11:36.117 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12576 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:11:36.118 DEBUG 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:11:36.118 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 17:11:36.731 INFO 12576 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 17:11:36.782 INFO 12576 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 49 ms. Found 2 JPA repository interfaces. +2025-05-22 17:11:37.018 INFO 12576 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$b0c2adfc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:11:37.197 INFO 12576 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 17:11:37.202 INFO 12576 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 17:11:37.204 INFO 12576 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 17:11:37.271 INFO 12576 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 17:11:37.272 INFO 12576 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1147 ms +2025-05-22 17:11:37.386 INFO 12576 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-3 - Starting... +2025-05-22 17:11:37.391 INFO 12576 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-3 - Start completed. +2025-05-22 17:11:37.392 INFO 12576 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 17:11:37.468 INFO 12576 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 17:11:37.491 INFO 12576 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 17:11:37.607 INFO 12576 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 17:11:37.607 INFO 12576 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 17:11:37.621 INFO 12576 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 17:11:37.951 WARN 12576 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 17:11:38.035 INFO 12576 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4d89fe00, org.springframework.security.web.context.SecurityContextPersistenceFilter@3ad31647, org.springframework.security.web.header.HeaderWriterFilter@315ce335, org.springframework.security.web.authentication.logout.LogoutFilter@2e9f9bf8, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@6d3ca86, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@1aa7d2a3, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@1f916c97, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@38d5d715, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6e46de71, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@44e120ae, org.springframework.security.web.session.SessionManagementFilter@7f31749e, org.springframework.security.web.access.ExceptionTranslationFilter@169292ca, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@f4a9c2f] +2025-05-22 17:11:38.188 INFO 12576 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:11:38.371 INFO 12576 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 17:11:38.383 INFO 12576 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 2.335 seconds (JVM running for 372.349) +2025-05-22 17:11:38.387 INFO 12576 --- [restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged +2025-05-22 17:11:40.331 INFO 4944 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 4944 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:11:40.340 DEBUG 4944 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:11:40.348 INFO 4944 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 17:11:44.627 INFO 4944 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$7c6e07a2] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:11:46.734 INFO 4944 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@251d7fdd, org.springframework.security.web.context.SecurityContextPersistenceFilter@15214920, org.springframework.security.web.header.HeaderWriterFilter@1e00bfe2, org.springframework.security.web.authentication.logout.LogoutFilter@5e599100, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@2fd1ad8a, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@691541bc, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@78e68401, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@426131d7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@525647f3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@391515c7, org.springframework.security.web.session.SessionManagementFilter@73bb1337, org.springframework.security.web.access.ExceptionTranslationFilter@7d2c345d, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@1efac5b9] +2025-05-22 17:11:47.871 INFO 4944 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:11:48.741 INFO 4944 --- [main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet '' +2025-05-22 17:11:48.742 INFO 4944 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet '' +2025-05-22 17:11:48.745 INFO 4944 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 2 ms +2025-05-22 17:11:48.856 INFO 4944 --- [main] c.c.c.c.CurrencyControllerTests : Started CurrencyControllerTests in 10.206 seconds (JVM running for 13.592) +2025-05-22 17:11:49.342 INFO 4944 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 17:12:17.153 INFO 9748 --- [main] c.c.c.c.CurrencyControllerTests : Starting CurrencyControllerTests using Java 11.0.27 on DESKTOP-7MLLRMP with PID 9748 (started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:12:17.156 DEBUG 9748 --- [main] c.c.c.c.CurrencyControllerTests : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:12:17.162 INFO 9748 --- [main] c.c.c.c.CurrencyControllerTests : No active profile set, falling back to default profiles: default +2025-05-22 17:12:21.021 INFO 9748 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$690c8501] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:12:22.628 INFO 9748 --- [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@118041c7, org.springframework.security.web.context.SecurityContextPersistenceFilter@20a24edf, org.springframework.security.web.header.HeaderWriterFilter@13cc0b90, org.springframework.security.web.authentication.logout.LogoutFilter@551be9f6, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@26be9a6, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@4ed18798, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@a2b54e3, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@691541bc, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@f245bdd, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@5c4cc644, org.springframework.security.web.session.SessionManagementFilter@3a3b10f4, org.springframework.security.web.access.ExceptionTranslationFilter@209f3887, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3520958b] +2025-05-22 17:12:23.398 INFO 9748 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:12:24.130 INFO 9748 --- [main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet '' +2025-05-22 17:12:24.132 INFO 9748 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Initializing Servlet '' +2025-05-22 17:12:24.135 INFO 9748 --- [main] o.s.t.web.servlet.TestDispatcherServlet : Completed initialization in 3 ms +2025-05-22 17:12:24.202 INFO 9748 --- [main] c.c.c.c.CurrencyControllerTests : Started CurrencyControllerTests in 8.242 seconds (JVM running for 11.534) +2025-05-22 17:12:24.553 INFO 9748 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:12:24.692 INFO 9748 --- [main] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:12:24.793 INFO 9748 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:12:25.126 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [null]; codes [NotNull.FXRequestDto.date,NotNull.date,NotNull.java.time.LocalDate,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Date is required] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullDateInput(CurrencyControllerTests.java:212) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:12:25.352 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character (']' (code 93)): expected a value; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:285) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:243) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:205) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testAddCurrencyWithInvalidInputCurrencies(CurrencyControllerTests.java:61) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] +Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] (through reference chain: com.crewmeister.cmcodingchallenge.currency.CurrencyWrapper["currencies"]) + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:356) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1726) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:373) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3521) ~[jackson-databind-2.11.3.jar:2.11.3] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:274) ~[spring-web-5.3.2.jar:5.3.2] + ... 142 common frames omitted +Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character (']' (code 93)): expected a value + at [Source: (PushbackInputStream); line: 6, column: 4] + at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1851) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:707) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:632) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2653) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:865) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:757) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:281) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:371) ~[jackson-databind-2.11.3.jar:2.11.3] + ... 146 common frames omitted + +2025-05-22 17:12:25.416 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [0.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithZeroAmountInput(CurrencyControllerTests.java:268) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] + +2025-05-22 17:12:25.454 INFO 9748 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:12:25.484 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [16-05-2025]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '16-05-2025'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [16-05-2025]] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithInValidDateInput(CurrencyControllerTests.java:246) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] -2025-05-20 17:37:52.948 WARN 12088 --- [http-nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] -2025-05-20 17:47:23.996 INFO 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 11788 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 17:47:24.001 DEBUG 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 17:47:24.002 INFO 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 17:47:24.112 INFO 11788 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 17:47:24.115 INFO 11788 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 17:47:25.251 INFO 11788 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 17:47:25.346 INFO 11788 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 81 ms. Found 1 JPA repository interfaces. -2025-05-20 17:47:25.768 INFO 11788 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$3bc152e2] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 17:47:26.566 INFO 11788 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 17:47:26.585 INFO 11788 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 17:47:26.586 INFO 11788 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 17:47:26.718 INFO 11788 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 17:47:26.719 INFO 11788 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2601 ms -2025-05-20 17:47:26.794 INFO 11788 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 17:47:26.987 INFO 11788 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 17:47:26.996 INFO 11788 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 17:47:27.161 INFO 11788 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 17:47:27.248 INFO 11788 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 17:47:27.555 INFO 11788 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 17:47:27.782 INFO 11788 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 17:47:28.893 INFO 11788 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 17:47:28.910 INFO 11788 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 17:47:28.938 INFO 11788 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 17:47:29.587 WARN 11788 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 17:47:29.744 INFO 11788 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 17:47:30.295 INFO 11788 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 17:47:30.312 INFO 11788 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.095 seconds (JVM running for 7.949) -2025-05-20 17:47:35.257 INFO 11788 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 17:47:35.259 INFO 11788 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 17:47:35.262 INFO 11788 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms -2025-05-20 17:47:35.405 WARN 11788 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] -2025-05-20 17:48:03.874 WARN 11788 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-12-2'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-12-2]] -2025-05-20 17:48:23.247 WARN 11788 --- [http-nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value 'ahd'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [ahd]] -2025-05-20 17:48:53.765 INFO 11788 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 17:49:00.056 INFO 11788 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 17:49:02.941 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 17:49:02.972 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 17:49:02.995 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:04.643 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN -2025-05-20 17:49:04.644 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:05.304 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL -2025-05-20 17:49:05.305 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:05.926 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD -2025-05-20 17:49:05.927 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:06.684 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF -2025-05-20 17:49:06.684 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:07.353 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY -2025-05-20 17:49:07.354 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:08.981 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP -2025-05-20 17:49:08.985 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:09.439 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK -2025-05-20 17:49:09.441 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:10.339 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK -2025-05-20 17:49:10.341 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:10.991 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK -2025-05-20 17:49:11.114 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:11.518 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP -2025-05-20 17:49:11.519 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:12.136 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD -2025-05-20 17:49:12.137 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:12.328 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD -2025-05-20 17:49:12.328 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:12.989 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK -2025-05-20 17:49:12.990 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:13.480 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF -2025-05-20 17:49:13.481 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:14.191 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR -2025-05-20 17:49:14.191 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:14.810 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS -2025-05-20 17:49:14.811 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:15.515 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 17:49:15.515 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:16.293 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK -2025-05-20 17:49:16.293 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:16.833 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY -2025-05-20 17:49:16.834 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:17.477 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW -2025-05-20 17:49:17.477 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:18.193 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL -2025-05-20 17:49:18.194 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:18.799 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL -2025-05-20 17:49:18.800 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:19.336 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL -2025-05-20 17:49:19.337 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:19.638 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN -2025-05-20 17:49:19.639 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:20.469 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR -2025-05-20 17:49:20.469 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:21.163 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK -2025-05-20 17:49:21.164 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:21.872 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD -2025-05-20 17:49:21.873 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:22.536 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP -2025-05-20 17:49:22.537 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:23.204 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN -2025-05-20 17:49:23.205 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:24.121 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL -2025-05-20 17:49:24.122 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:24.321 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RON -2025-05-20 17:49:24.321 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:25.070 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB -2025-05-20 17:49:25.072 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:25.602 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK -2025-05-20 17:49:25.603 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:26.215 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD -2025-05-20 17:49:26.217 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:26.808 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT -2025-05-20 17:49:26.809 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:27.177 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK -2025-05-20 17:49:27.177 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:27.619 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: THB -2025-05-20 17:49:27.620 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:28.266 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL -2025-05-20 17:49:28.267 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:28.482 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY -2025-05-20 17:49:28.483 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:28.967 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: USD -2025-05-20 17:49:28.969 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:49:29.783 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR -2025-05-20 17:49:29.784 INFO 11788 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:50:14.999 ERROR 11788 --- [http-nio-8080-exec-7] c.c.c.exception.GlobalExceptionHandler : Validation failed +2025-05-22 17:12:25.526 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'currency': rejected value [olk]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'olk'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.olk] +Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] @@ -551,47 +6446,136 @@ Field error in object 'FXRequestDto' on field 'currency': rejected value [olk]; at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithInValidCurrencyInput(CurrencyControllerTests.java:257) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] -2025-05-20 17:50:15.006 WARN 11788 --- [http-nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'currency': rejected value [olk]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'olk'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.olk]] -2025-05-20 17:50:49.865 ERROR 11788 --- [http-nio-8080-exec-8] c.c.c.exception.GlobalExceptionHandler : Validation failed +2025-05-22 17:12:25.673 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'amount': rejected value [-9.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] +Field error in object 'FXRequestDto' on field 'amount': rejected value []; codes [typeMismatch.FXRequestDto.amount,typeMismatch.amount,typeMismatch.double,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'double' for property 'amount'; nested exception is java.lang.NumberFormatException: empty String] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] @@ -606,47 +6590,139 @@ Field error in object 'FXRequestDto' on field 'amount': rejected value [-9.0]; c at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullAmountInput(CurrencyControllerTests.java:235) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] -2025-05-20 17:50:49.868 WARN 11788 --- [http-nio-8080-exec-8] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'amount': rejected value [-9.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number]] -2025-05-20 17:50:56.601 ERROR 11788 --- [http-nio-8080-exec-9] c.c.c.exception.GlobalExceptionHandler : Validation failed +2025-05-22 17:12:25.938 INFO 9748 --- [main] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:12:25.970 INFO 9748 --- [main] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@628b503a +2025-05-22 17:12:26.010 INFO 9748 --- [main] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:12:26.044 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null] +Field error in object 'FXRequestDto' on field 'amount': rejected value [-500.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] @@ -661,47 +6737,137 @@ Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; c at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNegativeAmountInput(CurrencyControllerTests.java:280) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] -2025-05-20 17:50:56.609 WARN 11788 --- [http-nio-8080-exec-9] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null]] -2025-05-20 17:51:14.823 ERROR 11788 --- [http-nio-8080-exec-10] c.c.c.exception.GlobalExceptionHandler : Validation failed +2025-05-22 17:12:26.081 INFO 9748 --- [main] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:12:26.107 ERROR 9748 --- [main] c.c.c.exception.GlobalExceptionHandler : Validation failed org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] +Field error in object 'FXRequestDto' on field 'currency': rejected value [null]; codes [NotNull.FXRequestDto.currency,NotNull.currency,NotNull.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Currency is required] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] @@ -716,48 +6882,174 @@ Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85 at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:77) ~[spring-test-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] - at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] + at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134) ~[spring-test-5.3.2.jar:5.3.2] + at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:183) ~[spring-test-5.3.2.jar:5.3.2] + at com.crewmeister.cmcodingchallenge.controllertests.CurrencyControllerTests.testGetFXAmountWithNullCurrencyInput(CurrencyControllerTests.java:224) ~[test-classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) ~[junit-platform-commons-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) ~[junit-platform-launcher-1.7.0.jar:1.7.0] + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) ~[junit5-rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) ~[junit-rt.jar:na] + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) ~[idea_rt.jar:na] + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) ~[junit-rt.jar:na] + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) ~[junit-rt.jar:na] -2025-05-20 17:51:14.826 WARN 11788 --- [http-nio-8080-exec-10] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]]] -2025-05-20 17:52:17.942 ERROR 11788 --- [http-nio-8080-exec-1] c.c.c.exception.GlobalExceptionHandler : Validation failed +2025-05-22 17:12:26.134 INFO 9748 --- [main] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:12:26.211 INFO 9748 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-05-22 17:12:57.547 INFO 3904 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 3904 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) +2025-05-22 17:12:57.552 DEBUG 3904 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 +2025-05-22 17:12:57.553 INFO 3904 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default +2025-05-22 17:12:57.640 INFO 3904 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-05-22 17:12:57.642 INFO 3904 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-05-22 17:12:58.833 INFO 3904 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2025-05-22 17:12:58.944 INFO 3904 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 97 ms. Found 2 JPA repository interfaces. +2025-05-22 17:12:59.432 INFO 3904 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$a69c2e9a] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) +2025-05-22 17:13:00.205 INFO 3904 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) +2025-05-22 17:13:00.220 INFO 3904 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-05-22 17:13:00.221 INFO 3904 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] +2025-05-22 17:13:00.339 INFO 3904 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-05-22 17:13:00.340 INFO 3904 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2697 ms +2025-05-22 17:13:00.409 INFO 3904 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-05-22 17:13:00.596 INFO 3904 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-05-22 17:13:00.604 INFO 3904 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +2025-05-22 17:13:00.783 INFO 3904 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] +2025-05-22 17:13:00.866 INFO 3904 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final +2025-05-22 17:13:01.079 INFO 3904 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} +2025-05-22 17:13:01.262 INFO 3904 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect +2025-05-22 17:13:02.334 INFO 3904 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] +2025-05-22 17:13:02.348 INFO 3904 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' +2025-05-22 17:13:02.381 INFO 3904 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-05-22 17:13:03.179 WARN 3904 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2025-05-22 17:13:03.443 INFO 3904 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6bf12bcf, org.springframework.security.web.context.SecurityContextPersistenceFilter@10395dab, org.springframework.security.web.header.HeaderWriterFilter@20d9757c, org.springframework.security.web.authentication.logout.LogoutFilter@29084c75, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@6e2eee7a, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter@337a3543, org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter@2cf89598, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5bdf9336, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3d0aaef4, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@46536e9d, org.springframework.security.web.session.SessionManagementFilter@6ca06e7f, org.springframework.security.web.access.ExceptionTranslationFilter@5da67142, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7cb8446d] +2025-05-22 17:13:03.626 INFO 3904 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-05-22 17:13:03.930 INFO 3904 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' +2025-05-22 17:13:03.945 INFO 3904 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.072 seconds (JVM running for 8.112) +2025-05-22 17:13:35.648 INFO 3904 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-05-22 17:13:35.651 INFO 3904 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-05-22 17:13:35.656 INFO 3904 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms +2025-05-22 17:13:36.320 ERROR 3904 --- [http-nio-8080-exec-1] c.c.c.exception.GlobalExceptionHandler : Validation failed -org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]] - at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] +org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected close marker ']': expected '}' (for Object starting at [Source: (PushbackInputStream); line: 1, column: 1]); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected close marker ']': expected '}' (for Object starting at [Source: (PushbackInputStream); line: 1, column: 1]) + at [Source: (PushbackInputStream); line: 3, column: 4] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:285) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:243) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:205) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158) ~[spring-webmvc-5.3.2.jar:5.3.2] + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:131) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] @@ -768,8 +7060,8 @@ Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85 at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] - at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] - at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.2.jar:5.3.2] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -777,6 +7069,50 @@ Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -805,47 +7141,205 @@ Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] +Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected close marker ']': expected '}' (for Object starting at [Source: (PushbackInputStream); line: 1, column: 1]) + at [Source: (PushbackInputStream); line: 3, column: 4] + at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1851) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:707) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.base.ParserBase._reportMismatchedEndMarker(ParserBase.java:1016) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._closeArrayScope(UTF8StreamJsonParser.java:3804) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:730) ~[jackson-core-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:160) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526) ~[jackson-databind-2.11.3.jar:2.11.3] + at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3521) ~[jackson-databind-2.11.3.jar:2.11.3] + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:274) ~[spring-web-5.3.2.jar:5.3.2] + ... 95 common frames omitted -2025-05-20 17:52:17.948 WARN 11788 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'date': rejected value [2025-62-85]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-62-85'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-62-85]]] -2025-05-20 17:52:45.757 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@33ec4a29 -2025-05-20 17:52:45.780 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 17:52:45.785 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 17:52:46.645 INFO 11788 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyServiceImpl : Conversion rate for INR on 2025-05-19 is 96.2175 -2025-05-20 18:48:42.537 INFO 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 15064 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 18:48:42.542 DEBUG 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 18:48:42.542 INFO 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 18:48:42.650 INFO 15064 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 18:48:42.651 INFO 15064 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 18:48:43.786 INFO 15064 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 18:48:43.887 INFO 15064 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 86 ms. Found 1 JPA repository interfaces. -2025-05-20 18:48:44.317 INFO 15064 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$7e69a3bd] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 18:48:45.088 INFO 15064 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 18:48:45.106 INFO 15064 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 18:48:45.106 INFO 15064 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 18:48:45.231 INFO 15064 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 18:48:45.232 INFO 15064 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2579 ms -2025-05-20 18:48:45.320 INFO 15064 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 18:48:45.518 INFO 15064 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 18:48:45.528 INFO 15064 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 18:48:45.698 INFO 15064 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 18:48:45.793 INFO 15064 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 18:48:46.002 INFO 15064 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 18:48:46.196 INFO 15064 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 18:48:47.242 INFO 15064 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 18:48:47.256 INFO 15064 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 18:48:47.284 INFO 15064 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 18:48:48.001 WARN 15064 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 18:48:48.177 INFO 15064 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 18:48:48.594 INFO 15064 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 18:48:48.612 INFO 15064 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.277 seconds (JVM running for 8.058) -2025-05-20 18:49:04.262 INFO 15064 --- [http-nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 18:49:04.264 INFO 15064 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 18:49:04.266 INFO 15064 --- [http-nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms -2025-05-20 18:49:04.398 ERROR 15064 --- [http-nio-8080-exec-2] c.c.c.exception.GlobalExceptionHandler : Validation failed +2025-05-22 17:13:36.510 WARN 3904 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected close marker ']': expected '}' (for Object starting at [Source: (PushbackInputStream); line: 1, column: 1]); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected close marker ']': expected '}' (for Object starting at [Source: (PushbackInputStream); line: 1, column: 1]) + at [Source: (PushbackInputStream); line: 3, column: 4]] +2025-05-22 17:13:42.473 INFO 3904 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:13:42.491 WARN 3904 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.IllegalArgumentException: Currency list must not be null or empty] +2025-05-22 17:13:47.650 INFO 3904 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Adding the list of Currency +2025-05-22 17:13:56.679 INFO 3904 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the list of Currencies +2025-05-22 17:14:02.094 WARN 3904 --- [http-nio-8080-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-]] +2025-05-22 17:14:09.304 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:14:09.322 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 17:14:09.365 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:13.491 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 17:14:13.493 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:14.328 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 17:14:14.329 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:14.944 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 17:14:14.945 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:15.830 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 17:14:15.831 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:16.539 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 17:14:16.540 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:17.132 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 17:14:17.133 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:17.431 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 17:14:17.432 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:18.073 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 17:14:18.076 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:19.268 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 17:14:19.274 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:20.083 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 17:14:20.112 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:21.819 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 17:14:21.823 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:21.981 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 17:14:21.983 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:22.571 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 17:14:22.572 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:23.078 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 17:14:23.079 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:23.818 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 17:14:23.819 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:24.394 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 17:14:24.395 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:25.006 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 17:14:25.007 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:25.622 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 17:14:25.623 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:26.178 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 17:14:26.179 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:26.898 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 17:14:26.899 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:27.507 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 17:14:27.509 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:27.980 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 17:14:27.981 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:28.241 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 17:14:28.242 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:28.543 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 17:14:28.544 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:29.085 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 17:14:29.086 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:29.987 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 17:14:29.988 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:30.763 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 17:14:30.764 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:31.295 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 17:14:31.296 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:31.881 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 17:14:31.882 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:32.558 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 17:14:32.559 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:32.756 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 17:14:32.757 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:33.272 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 17:14:33.273 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:34.088 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 17:14:34.090 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:35.251 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 17:14:35.252 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:36.673 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 17:14:36.674 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:36.897 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 17:14:36.902 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:37.177 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 17:14:37.177 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:37.861 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 17:14:37.862 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:38.112 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 17:14:38.113 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:38.423 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 17:14:38.424 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:14:38.937 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 17:14:38.938 INFO 3904 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:15:56.771 INFO 3904 --- [http-nio-8080-exec-8] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:15:57.225 WARN 3904 --- [http-nio-8080-exec-8] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name as validated from db] +2025-05-22 17:16:09.120 INFO 3904 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:16:09.150 INFO 3904 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 17:16:09.160 INFO 3904 --- [http-nio-8080-exec-9] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:19.084 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies +2025-05-22 17:16:19.174 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD +2025-05-22 17:16:19.176 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:20.435 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN +2025-05-22 17:16:20.436 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:20.843 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL +2025-05-22 17:16:20.843 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:21.240 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD +2025-05-22 17:16:21.241 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:22.073 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF +2025-05-22 17:16:22.074 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:23.303 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY +2025-05-22 17:16:23.304 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:24.041 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP +2025-05-22 17:16:24.041 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:24.391 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK +2025-05-22 17:16:24.392 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:25.164 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK +2025-05-22 17:16:25.165 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:25.877 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK +2025-05-22 17:16:25.878 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:26.262 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP +2025-05-22 17:16:26.263 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:27.015 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD +2025-05-22 17:16:27.016 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:27.183 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD +2025-05-22 17:16:27.185 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:27.854 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK +2025-05-22 17:16:27.855 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:28.858 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF +2025-05-22 17:16:28.860 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:30.623 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR +2025-05-22 17:16:30.624 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:31.389 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS +2025-05-22 17:16:31.390 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:32.457 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 17:16:32.458 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:33.141 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK +2025-05-22 17:16:33.142 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:33.797 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY +2025-05-22 17:16:33.798 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:34.330 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW +2025-05-22 17:16:34.330 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:34.774 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL +2025-05-22 17:16:34.775 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:35.162 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL +2025-05-22 17:16:35.163 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:35.610 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL +2025-05-22 17:16:35.611 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:35.989 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN +2025-05-22 17:16:35.990 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:36.671 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR +2025-05-22 17:16:36.672 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:37.345 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK +2025-05-22 17:16:37.346 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:38.017 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD +2025-05-22 17:16:38.018 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:38.613 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP +2025-05-22 17:16:38.613 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:39.241 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN +2025-05-22 17:16:39.242 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:39.812 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL +2025-05-22 17:16:39.813 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:39.975 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: RON +2025-05-22 17:16:39.977 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:40.667 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB +2025-05-22 17:16:40.669 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:41.294 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK +2025-05-22 17:16:41.296 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:41.972 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD +2025-05-22 17:16:41.973 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:42.666 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT +2025-05-22 17:16:42.667 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:42.908 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK +2025-05-22 17:16:42.909 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:43.449 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: THB +2025-05-22 17:16:43.450 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:44.883 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL +2025-05-22 17:16:44.900 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:45.209 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY +2025-05-22 17:16:45.212 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:45.863 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: USD +2025-05-22 17:16:45.864 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:16:46.536 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR +2025-05-22 17:16:46.537 INFO 3904 --- [http-nio-8080-exec-10] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:17:02.365 ERROR 3904 --- [http-nio-8080-exec-1] c.c.c.exception.GlobalExceptionHandler : Validation failed org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS] +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] @@ -866,6 +7360,50 @@ Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -895,30 +7433,16 @@ Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 18:49:04.455 WARN 15064 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors -Field error in object 'FXRequestDto' on field 'currency': rejected value [INS]; codes [typeMismatch.FXRequestDto.currency,typeMismatch.currency,typeMismatch.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS]] -2025-05-20 18:50:57.344 INFO 15064 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 18:50:57.389 ERROR 15064 --- [http-nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause - -java.lang.NullPointerException: null - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:67) ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$40a57405.getFXRates() ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] +2025-05-22 17:17:02.388 WARN 3904 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null]] +2025-05-22 17:17:14.265 ERROR 3904 --- [http-nio-8080-exec-2] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [null]; codes [NotNull.FXRequestDto.currency,NotNull.currency,NotNull.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Currency is required] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -935,6 +7459,50 @@ java.lang.NullPointerException: null at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -964,28 +7532,18 @@ java.lang.NullPointerException: null at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 18:51:34.808 INFO 15064 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 18:51:34.814 ERROR 15064 --- [http-nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause - -java.lang.NullPointerException: null - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:67) ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$40a57405.getFXRates() ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] +2025-05-22 17:17:14.280 WARN 3904 --- [http-nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [null]; codes [NotNull.FXRequestDto.currency,NotNull.currency,NotNull.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Currency is required]] +2025-05-22 17:17:20.178 ERROR 3904 --- [http-nio-8080-exec-3] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 3 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [null]; codes [NotNull.FXRequestDto.currency,NotNull.currency,NotNull.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Currency is required] +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null] +Field error in object 'FXRequestDto' on field 'date': rejected value [null]; codes [NotNull.FXRequestDto.date,NotNull.date,NotNull.java.time.LocalDate,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Date is required] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -1002,6 +7560,50 @@ java.lang.NullPointerException: null at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -1031,177 +7633,18 @@ java.lang.NullPointerException: null at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 19:02:57.027 INFO 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 888 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 19:02:57.032 DEBUG 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 19:02:57.033 INFO 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 19:02:57.168 INFO 888 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 19:02:57.170 INFO 888 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 19:02:58.302 INFO 888 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 19:02:58.399 INFO 888 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 82 ms. Found 1 JPA repository interfaces. -2025-05-20 19:02:58.834 INFO 888 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$56ab939] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 19:02:59.641 INFO 888 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 19:02:59.663 INFO 888 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 19:02:59.664 INFO 888 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 19:02:59.794 INFO 888 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 19:02:59.795 INFO 888 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2623 ms -2025-05-20 19:02:59.873 INFO 888 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 19:03:00.210 INFO 888 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 19:03:00.222 INFO 888 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 19:03:00.437 INFO 888 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 19:03:00.540 INFO 888 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 19:03:00.828 INFO 888 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 19:03:01.023 INFO 888 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 19:03:02.109 INFO 888 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 19:03:02.126 INFO 888 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 19:03:02.176 INFO 888 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 19:03:03.007 WARN 888 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 19:03:03.179 INFO 888 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 19:03:03.566 INFO 888 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 19:03:03.587 INFO 888 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 7.326 seconds (JVM running for 8.173) -2025-05-20 19:03:12.790 INFO 888 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 19:03:12.791 INFO 888 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 19:03:12.794 INFO 888 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms -2025-05-20 19:03:12.862 INFO 888 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:03:35.865 INFO 888 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 19:03:39.182 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:03:39.217 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 19:03:39.280 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:41.093 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN -2025-05-20 19:03:41.094 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:41.755 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL -2025-05-20 19:03:41.756 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:42.305 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD -2025-05-20 19:03:42.306 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:43.212 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF -2025-05-20 19:03:43.213 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:43.888 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY -2025-05-20 19:03:43.889 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:44.532 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP -2025-05-20 19:03:44.533 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:44.836 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK -2025-05-20 19:03:44.837 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:45.489 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK -2025-05-20 19:03:45.490 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:46.204 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK -2025-05-20 19:03:46.205 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:46.660 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP -2025-05-20 19:03:46.685 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:47.834 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD -2025-05-20 19:03:47.835 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:48.134 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD -2025-05-20 19:03:48.137 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:49.219 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK -2025-05-20 19:03:49.220 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:49.872 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF -2025-05-20 19:03:49.873 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:50.629 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR -2025-05-20 19:03:50.630 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:51.321 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS -2025-05-20 19:03:51.322 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:51.965 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 19:03:51.966 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:52.716 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK -2025-05-20 19:03:52.717 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:53.282 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY -2025-05-20 19:03:53.283 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:53.930 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW -2025-05-20 19:03:53.931 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:54.925 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL -2025-05-20 19:03:54.926 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:55.420 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL -2025-05-20 19:03:55.421 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:55.825 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL -2025-05-20 19:03:55.826 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:56.500 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN -2025-05-20 19:03:56.504 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:58.236 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR -2025-05-20 19:03:58.238 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:03:59.626 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK -2025-05-20 19:03:59.630 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:00.683 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD -2025-05-20 19:04:00.776 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:03.038 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP -2025-05-20 19:04:03.039 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:04.845 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN -2025-05-20 19:04:04.846 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:06.094 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL -2025-05-20 19:04:06.095 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:06.308 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON -2025-05-20 19:04:06.310 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:06.912 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB -2025-05-20 19:04:06.914 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:07.780 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK -2025-05-20 19:04:07.781 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:08.411 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD -2025-05-20 19:04:08.412 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:09.079 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT -2025-05-20 19:04:09.080 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:09.516 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK -2025-05-20 19:04:09.517 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:09.883 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB -2025-05-20 19:04:09.885 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:10.542 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL -2025-05-20 19:04:10.543 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:10.731 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY -2025-05-20 19:04:10.732 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:11.193 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD -2025-05-20 19:04:11.194 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:04:11.749 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR -2025-05-20 19:04:11.750 INFO 888 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:06:51.603 INFO 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 4704 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 19:06:51.608 DEBUG 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 19:06:51.609 INFO 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 19:06:51.721 INFO 4704 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 19:06:51.722 INFO 4704 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 19:06:53.978 INFO 4704 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 19:06:54.088 INFO 4704 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 95 ms. Found 1 JPA repository interfaces. -2025-05-20 19:06:54.628 INFO 4704 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$9c5cad06] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 19:06:55.461 INFO 4704 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 19:06:55.476 INFO 4704 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 19:06:55.477 INFO 4704 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 19:06:55.590 INFO 4704 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 19:06:55.592 INFO 4704 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3867 ms -2025-05-20 19:06:55.658 INFO 4704 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 19:06:55.827 INFO 4704 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 19:06:55.836 INFO 4704 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 19:06:55.985 INFO 4704 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 19:06:56.098 INFO 4704 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 19:06:56.353 INFO 4704 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 19:06:56.521 INFO 4704 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 19:06:57.457 INFO 4704 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 19:06:57.472 INFO 4704 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 19:06:57.497 INFO 4704 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 19:06:58.391 WARN 4704 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 19:06:58.582 INFO 4704 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 19:06:58.911 INFO 4704 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 19:06:58.928 INFO 4704 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 8.235 seconds (JVM running for 9.216) -2025-05-20 19:07:03.607 INFO 4704 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 19:07:03.609 INFO 4704 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 19:07:03.612 INFO 4704 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms -2025-05-20 19:07:03.676 INFO 4704 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:07:19.166 INFO 4704 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:07:30.943 INFO 4704 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:07:30.995 ERROR 4704 --- [http-nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Invalid Currency Name] with root cause - -java.lang.RuntimeException: Invalid Currency Name - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:74) ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$5baa5f9f.getFXRates() ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] +2025-05-22 17:17:20.184 WARN 3904 --- [http-nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 3 errors +Field error in object 'FXRequestDto' on field 'currency': rejected value [null]; codes [NotNull.FXRequestDto.currency,NotNull.currency,NotNull.com.crewmeister.cmcodingchallenge.currency.CurrencyConstants,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.currency,currency]; arguments []; default message [currency]]; default message [Currency is required] +Field error in object 'FXRequestDto' on field 'amount': rejected value [null]; codes [NotNull.FXRequestDto.amount,NotNull.amount,NotNull.double,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [must not be null] +Field error in object 'FXRequestDto' on field 'date': rejected value [null]; codes [NotNull.FXRequestDto.date,NotNull.date,NotNull.java.time.LocalDate,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Date is required]] +2025-05-22 17:17:48.013 ERROR 3904 --- [http-nio-8080-exec-4] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [2025-65-15]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-65-15'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-65-15]] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -1218,6 +7661,50 @@ java.lang.RuntimeException: Invalid Currency Name at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -1247,29 +7734,20 @@ java.lang.RuntimeException: Invalid Currency Name at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 19:07:55.537 INFO 4704 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 19:07:59.649 INFO 4704 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:07:59.660 ERROR 4704 --- [http-nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Invalid Currency Name] with root cause - -java.lang.RuntimeException: Invalid Currency Name - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:74) ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$5baa5f9f.getFXRates() ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] +2025-05-22 17:17:48.022 WARN 3904 --- [http-nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'date': rejected value [2025-65-15]; codes [typeMismatch.FXRequestDto.date,typeMismatch.date,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull @org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2025-65-15'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2025-65-15]]] +2025-05-22 17:18:01.164 INFO 3904 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@6a71dc35 +2025-05-22 17:18:01.191 INFO 3904 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 17:18:01.203 INFO 3904 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:18:01.958 INFO 3904 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Conversion rate for INR on 2025-05-15 is 95.647 +2025-05-22 17:18:08.114 ERROR 3904 --- [http-nio-8080-exec-6] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-20.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -1286,6 +7764,50 @@ java.lang.RuntimeException: Invalid Currency Name at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -1315,28 +7837,16 @@ java.lang.RuntimeException: Invalid Currency Name at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 19:08:17.169 INFO 4704 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:08:17.180 ERROR 4704 --- [http-nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class com.crewmeister.cmcodingchallenge.currency.Currency ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.crewmeister.cmcodingchallenge.currency.Currency is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @48ed5919)] with root cause - -java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class com.crewmeister.cmcodingchallenge.currency.Currency ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; com.crewmeister.cmcodingchallenge.currency.Currency is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @48ed5919) - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl.getFXRates(CurrencyServiceImpl.java:72) ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$FastClassBySpringCGLIB$$cd0e1ebe.invoke() ~[classes/:na] - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.invoke(AnnotationAwareRetryOperationsInterceptor.java:166) ~[spring-retry-1.3.0.jar:na] - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.3.2.jar:5.3.2] - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.3.2.jar:5.3.2] - at com.crewmeister.cmcodingchallenge.currencyservice.CurrencyServiceImpl$$EnhancerBySpringCGLIB$$5baa5f9f.getFXRates() ~[classes/:na] - at com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController.getAllFXRates(CurrencyController.java:58) ~[classes/:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] - at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] - at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] - at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] +2025-05-22 17:18:08.123 WARN 3904 --- [http-nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [-20.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number]] +2025-05-22 17:18:18.698 ERROR 3904 --- [http-nio-8080-exec-7] c.c.c.exception.GlobalExceptionHandler : Validation failed + +org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [0.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number] + at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] @@ -1353,6 +7863,50 @@ java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter.doFilterInternal(DefaultLogoutPageGeneratingFilter.java:58) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:237) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:223) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183) ~[spring-security-web-5.4.2.jar:5.4.2] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.3.2.jar:5.3.2] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.3.2.jar:5.3.2] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] @@ -1382,251 +7936,10 @@ java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] -2025-05-20 19:12:14.064 INFO 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 12416 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 19:12:14.067 DEBUG 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 19:12:14.068 INFO 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 19:12:14.173 INFO 12416 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 19:12:14.174 INFO 12416 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 19:12:15.374 INFO 12416 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 19:12:15.471 INFO 12416 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 82 ms. Found 1 JPA repository interfaces. -2025-05-20 19:12:15.904 INFO 12416 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$51d058dc] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 19:12:16.650 INFO 12416 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 19:12:16.666 INFO 12416 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 19:12:16.667 INFO 12416 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 19:12:16.777 INFO 12416 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 19:12:16.777 INFO 12416 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2601 ms -2025-05-20 19:12:16.882 INFO 12416 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 19:12:17.059 INFO 12416 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 19:12:17.069 INFO 12416 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 19:12:17.232 INFO 12416 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 19:12:17.317 INFO 12416 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 19:12:17.541 INFO 12416 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 19:12:17.717 INFO 12416 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 19:12:18.796 INFO 12416 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 19:12:18.809 INFO 12416 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 19:12:18.836 INFO 12416 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 19:12:19.529 WARN 12416 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 19:12:19.689 INFO 12416 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 19:12:20.027 INFO 12416 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 19:12:20.042 INFO 12416 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.746 seconds (JVM running for 7.583) -2025-05-20 19:12:25.195 INFO 12416 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 19:12:25.197 INFO 12416 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 19:12:25.199 INFO 12416 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms -2025-05-20 19:12:25.284 INFO 12416 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:12:25.406 WARN 12416 --- [http-nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name] -2025-05-20 19:12:37.084 INFO 12416 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 19:12:40.053 INFO 12416 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:12:40.090 INFO 12416 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 19:12:40.167 INFO 12416 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:09.810 INFO 12416 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:13:09.827 WARN 12416 --- [http-nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name] -2025-05-20 19:13:35.478 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:13:35.569 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 19:13:35.571 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:36.270 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN -2025-05-20 19:13:36.271 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:36.808 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL -2025-05-20 19:13:36.809 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:37.444 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD -2025-05-20 19:13:37.445 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:38.122 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF -2025-05-20 19:13:38.123 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:38.745 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY -2025-05-20 19:13:38.746 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:39.277 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP -2025-05-20 19:13:39.278 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:39.625 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK -2025-05-20 19:13:39.626 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:40.268 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK -2025-05-20 19:13:40.269 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:40.923 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK -2025-05-20 19:13:40.924 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:41.243 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP -2025-05-20 19:13:41.243 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:42.090 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD -2025-05-20 19:13:42.091 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:42.250 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD -2025-05-20 19:13:42.251 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:42.816 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK -2025-05-20 19:13:42.817 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:43.345 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF -2025-05-20 19:13:43.346 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:44.001 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR -2025-05-20 19:13:44.002 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:44.580 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS -2025-05-20 19:13:44.581 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:46.078 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 19:13:46.079 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:46.851 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK -2025-05-20 19:13:46.852 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:47.429 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY -2025-05-20 19:13:47.430 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:48.163 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW -2025-05-20 19:13:48.164 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:48.804 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL -2025-05-20 19:13:48.805 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:49.255 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL -2025-05-20 19:13:49.256 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:49.689 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL -2025-05-20 19:13:49.690 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:49.923 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN -2025-05-20 19:13:49.924 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:50.601 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR -2025-05-20 19:13:50.602 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:51.418 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK -2025-05-20 19:13:51.418 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:52.021 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD -2025-05-20 19:13:52.022 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:52.692 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP -2025-05-20 19:13:52.693 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:53.281 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN -2025-05-20 19:13:53.282 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:54.008 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL -2025-05-20 19:13:54.009 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:54.188 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RON -2025-05-20 19:13:54.189 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:54.739 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB -2025-05-20 19:13:54.740 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:55.253 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK -2025-05-20 19:13:55.254 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:55.784 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD -2025-05-20 19:13:55.784 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:56.352 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT -2025-05-20 19:13:56.352 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:56.533 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK -2025-05-20 19:13:56.534 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:56.862 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: THB -2025-05-20 19:13:56.862 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:57.471 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL -2025-05-20 19:13:57.471 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:57.637 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY -2025-05-20 19:13:57.638 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:58.068 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: USD -2025-05-20 19:13:58.069 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:13:58.607 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR -2025-05-20 19:13:58.608 INFO 12416 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:11.448 INFO 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Starting CmCodingChallengeApplication using Java 11.0.27 on DESKTOP-7MLLRMP with PID 5508 (C:\Users\LENOVO\IntellijProjects\java-coding-challenge\target\classes started by LENOVO in C:\Users\LENOVO\IntellijProjects\java-coding-challenge) -2025-05-20 19:19:11.452 DEBUG 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Running with Spring Boot v2.4.1, Spring v5.3.2 -2025-05-20 19:19:11.453 INFO 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : No active profile set, falling back to default profiles: default -2025-05-20 19:19:11.543 INFO 5508 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable -2025-05-20 19:19:11.544 INFO 5508 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' -2025-05-20 19:19:12.819 INFO 5508 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. -2025-05-20 19:19:12.928 INFO 5508 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 94 ms. Found 1 JPA repository interfaces. -2025-05-20 19:19:13.357 INFO 5508 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.retry.annotation.RetryConfiguration' of type [org.springframework.retry.annotation.RetryConfiguration$$EnhancerBySpringCGLIB$$9c5cad06] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) -2025-05-20 19:19:14.128 INFO 5508 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) -2025-05-20 19:19:14.144 INFO 5508 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] -2025-05-20 19:19:14.145 INFO 5508 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41] -2025-05-20 19:19:14.269 INFO 5508 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext -2025-05-20 19:19:14.270 INFO 5508 --- [restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2724 ms -2025-05-20 19:19:14.340 INFO 5508 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... -2025-05-20 19:19:14.523 INFO 5508 --- [restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. -2025-05-20 19:19:14.532 INFO 5508 --- [restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' -2025-05-20 19:19:14.695 INFO 5508 --- [restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] -2025-05-20 19:19:14.780 INFO 5508 --- [restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.25.Final -2025-05-20 19:19:15.013 INFO 5508 --- [restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} -2025-05-20 19:19:15.192 INFO 5508 --- [restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect -2025-05-20 19:19:16.136 INFO 5508 --- [restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] -2025-05-20 19:19:16.151 INFO 5508 --- [restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' -2025-05-20 19:19:16.178 INFO 5508 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 -2025-05-20 19:19:16.917 WARN 5508 --- [restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning -2025-05-20 19:19:17.100 INFO 5508 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' -2025-05-20 19:19:17.429 INFO 5508 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' -2025-05-20 19:19:17.444 INFO 5508 --- [restartedMain] c.c.c.CmCodingChallengeApplication : Started CmCodingChallengeApplication in 6.711 seconds (JVM running for 7.784) -2025-05-20 19:19:29.873 INFO 5508 --- [http-nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' -2025-05-20 19:19:29.874 INFO 5508 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' -2025-05-20 19:19:29.876 INFO 5508 --- [http-nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms -2025-05-20 19:19:29.951 INFO 5508 --- [http-nio-8080-exec-1] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:19:34.302 INFO 5508 --- [http-nio-8080-exec-2] c.c.c.c.CurrencyController : Adding the list of Currency -2025-05-20 19:19:35.998 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:19:36.027 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: AUD -2025-05-20 19:19:36.041 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.AUD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:37.242 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BGN -2025-05-20 19:19:37.243 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BGN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:37.629 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: BRL -2025-05-20 19:19:37.630 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.BRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:38.059 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CAD -2025-05-20 19:19:38.060 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CAD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:38.462 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF -2025-05-20 19:19:38.463 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:38.952 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CNY -2025-05-20 19:19:38.953 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CNY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:39.364 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CYP -2025-05-20 19:19:39.365 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CYP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:39.660 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: CZK -2025-05-20 19:19:39.662 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CZK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:41.365 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: DKK -2025-05-20 19:19:41.367 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.DKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:42.113 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: EEK -2025-05-20 19:19:42.115 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.EEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:42.418 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GBP -2025-05-20 19:19:42.419 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GBP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:43.154 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: GRD -2025-05-20 19:19:43.157 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.GRD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:43.334 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HKD -2025-05-20 19:19:43.335 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HKD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:43.956 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HRK -2025-05-20 19:19:43.957 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HRK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:44.457 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: HUF -2025-05-20 19:19:44.458 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.HUF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:45.111 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: IDR -2025-05-20 19:19:45.112 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.IDR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:45.673 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ILS -2025-05-20 19:19:45.674 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ILS.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:46.193 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 19:19:46.194 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:46.742 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ISK -2025-05-20 19:19:46.743 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ISK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:47.292 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: JPY -2025-05-20 19:19:47.293 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.JPY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:48.099 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: KRW -2025-05-20 19:19:48.100 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.KRW.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:48.691 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LTL -2025-05-20 19:19:48.692 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:48.967 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: LVL -2025-05-20 19:19:48.968 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.LVL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:49.330 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MTL -2025-05-20 19:19:49.331 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MTL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:49.573 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MXN -2025-05-20 19:19:49.574 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MXN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:50.272 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: MYR -2025-05-20 19:19:50.273 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.MYR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:50.798 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NOK -2025-05-20 19:19:50.799 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NOK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:51.209 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: NZD -2025-05-20 19:19:51.210 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.NZD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:51.752 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PHP -2025-05-20 19:19:51.753 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PHP.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:52.323 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: PLN -2025-05-20 19:19:52.324 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.PLN.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:52.890 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ROL -2025-05-20 19:19:52.891 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ROL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:53.177 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RON -2025-05-20 19:19:53.178 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RON.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:53.728 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: RUB -2025-05-20 19:19:53.729 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.RUB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:54.217 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SEK -2025-05-20 19:19:54.218 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SEK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:54.760 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SGD -2025-05-20 19:19:54.761 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SGD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:55.320 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SIT -2025-05-20 19:19:55.326 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SIT.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:55.502 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: SKK -2025-05-20 19:19:55.503 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.SKK.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:55.814 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: THB -2025-05-20 19:19:55.815 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.THB.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:57.294 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRL -2025-05-20 19:19:57.295 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRL.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:57.563 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: TRY -2025-05-20 19:19:57.564 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.TRY.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:58.030 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: USD -2025-05-20 19:19:58.032 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.USD.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:19:58.508 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Processing currency: ZAR -2025-05-20 19:19:58.509 INFO 5508 --- [http-nio-8080-exec-3] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.ZAR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:20:12.294 INFO 5508 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:20:12.330 INFO 5508 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Processing currency: INR -2025-05-20 19:20:12.331 INFO 5508 --- [http-nio-8080-exec-4] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:20:16.578 INFO 5508 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:20:16.581 INFO 5508 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Processing currency: CHF -2025-05-20 19:20:16.582 INFO 5508 --- [http-nio-8080-exec-5] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.CHF.EUR.BB.AC.000?format=sdmx&lang=en -2025-05-20 19:20:25.468 INFO 5508 --- [http-nio-8080-exec-6] c.c.c.c.CurrencyController : Fetching the fx rates of Currencies -2025-05-20 19:20:25.480 WARN 5508 --- [http-nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: Invalid Currency Name as validated from db] +2025-05-22 17:18:18.704 WARN 3904 --- [http-nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors +Field error in object 'FXRequestDto' on field 'amount': rejected value [0.0]; codes [Positive.FXRequestDto.amount,Positive.amount,Positive.double,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [FXRequestDto.amount,amount]; arguments []; default message [amount]]; default message [Amount must be a positive number]] +2025-05-22 17:18:23.598 INFO 3904 --- [http-nio-8080-exec-8] c.c.c.c.CurrencyController : Received FX request: com.crewmeister.cmcodingchallenge.currencydto.FXRequestDto@55fa9d36 +2025-05-22 17:18:23.598 INFO 3904 --- [http-nio-8080-exec-8] c.c.c.c.CurrencyServiceImpl : Processing currency: INR +2025-05-22 17:18:23.599 INFO 3904 --- [http-nio-8080-exec-8] c.c.c.c.CurrencyServiceImpl : Requesting FX data from URL: https://api.statistiken.bundesbank.de/rest/download/BBEX3/D.INR.EUR.BB.AC.000?format=sdmx&lang=en +2025-05-22 17:18:24.212 INFO 3904 --- [http-nio-8080-exec-8] c.c.c.c.CurrencyServiceImpl : Conversion rate for INR on 2025-05-15 is 95.647 +2025-05-22 17:18:39.352 WARN 3904 --- [http-nio-8080-exec-9] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [506] milliseconds. diff --git a/pom.xml b/pom.xml index ebff352..05d4434 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,11 @@ org.springframework.boot spring-boot-starter-aop + + org.springframework.boot + spring-boot-starter-security + + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java index 597de48..1de79e9 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencycontroller/CurrencyController.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; @RestController() -@RequestMapping("/api") +@RequestMapping("/cmfxapi") public class CurrencyController { private static final Logger logger = LoggerFactory.getLogger(CurrencyController.class); diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java index d117f32..640d037 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/currencyservice/CurrencyServiceImpl.java @@ -85,7 +85,7 @@ public Map> getFXRates(String date,String currency) } } - Map> fxMapResult = new HashMap<>(); + Map> fxMapResult = new TreeMap<>(); for(Currency fxcurrency: currencies) { logger.info("Processing currency: {}",fxcurrency.getCurrencyName()); String url = buildUrl(fxcurrency.getCurrencyName()); @@ -95,7 +95,7 @@ public Map> getFXRates(String date,String currency) logger.warn("Received empty response for currency {}", fxcurrency.getCurrencyName()); continue; } - Map fxMap = new HashMap<>(); + Map fxMap = new TreeMap<>(); for (Observation obs : genericData.dataSet.series.observations) { diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java index e9a4d5e..a0a7399 100644 --- a/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/crewmeister/cmcodingchallenge/exception/GlobalExceptionHandler.java @@ -76,7 +76,7 @@ public ResponseEntity handleIllegalArguments(IllegalArgumentException ex @ExceptionHandler(MethodArgumentTypeMismatchException.class) public ResponseEntity handleTypeMismatch(MethodArgumentTypeMismatchException ex) { - String error = String.format("Invalid value '%s' for parameter '%s'. Expected type: %s", + String error = String.format("Invalid value '%s' for parameter '%s'. Expected format is yyyy-MM-dd and type: %s", ex.getValue(), ex.getName(), ex.getRequiredType().getSimpleName()); return new ResponseEntity<>(Map.of("error", error), HttpStatus.BAD_REQUEST); } diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/security/ApiUsers.java b/src/main/java/com/crewmeister/cmcodingchallenge/security/ApiUsers.java new file mode 100644 index 0000000..ea5848b --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/security/ApiUsers.java @@ -0,0 +1,51 @@ +package com.crewmeister.cmcodingchallenge.security; + +import javax.persistence.*; + +@Entity +@Table(name = "users") +public class ApiUsers { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String username; + + private String password; + + private String role; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } +} + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/security/MyUserDetailsService.java b/src/main/java/com/crewmeister/cmcodingchallenge/security/MyUserDetailsService.java new file mode 100644 index 0000000..f6bd31b --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/security/MyUserDetailsService.java @@ -0,0 +1,37 @@ +package com.crewmeister.cmcodingchallenge.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.security.core.userdetails.User; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class MyUserDetailsService implements UserDetailsService { + + @Autowired + UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + ApiUsers appUser = userRepository.findByUsername(username) + .orElseThrow(() -> new UsernameNotFoundException("Invalid User")); + + return User.withUsername(appUser.getUsername()) + .password(appUser.getPassword()) + .roles(appUser.getRole()) + .build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} + + diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/security/SecurityConfig.java b/src/main/java/com/crewmeister/cmcodingchallenge/security/SecurityConfig.java new file mode 100644 index 0000000..f96d68d --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/security/SecurityConfig.java @@ -0,0 +1,41 @@ +package com.crewmeister.cmcodingchallenge.security; + +import com.crewmeister.cmcodingchallenge.security.MyUserDetailsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private MyUserDetailsService userDetailsService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService) + .passwordEncoder(passwordEncoder); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .csrf().disable() + .headers().frameOptions().disable() + .and() + .authorizeRequests() + .antMatchers("/cmfxapi/**").permitAll() + .antMatchers("/h2-console/**").permitAll() + .anyRequest().authenticated() + .and() + .formLogin(); + } +} diff --git a/src/main/java/com/crewmeister/cmcodingchallenge/security/UserRepository.java b/src/main/java/com/crewmeister/cmcodingchallenge/security/UserRepository.java new file mode 100644 index 0000000..92eec5a --- /dev/null +++ b/src/main/java/com/crewmeister/cmcodingchallenge/security/UserRepository.java @@ -0,0 +1,9 @@ +package com.crewmeister.cmcodingchallenge.security; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByUsername(String username); +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c72e9de..8e3e2a8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,12 @@ # H2 Database Configuration -spring.datasource.url=jdbc:h2:mem:testdb + +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console +spring.datasource.initialization-mode=always # JPA / Hibernate spring.jpa.database-platform=org.hibernate.dialect.H2Dialect diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql new file mode 100644 index 0000000..2bf4451 --- /dev/null +++ b/src/main/resources/data.sql @@ -0,0 +1,3 @@ +delete from users; +INSERT INTO users (username, password, role) VALUES +('user1', '$2a$12$c7yg/wiUDQBr1oaD4Y6amug2E3eTYEWTOlvYPI.5xCb5LELEBK9Yq', 'USER'); --password123 \ No newline at end of file diff --git a/src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java b/src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java index c2974db..13a6e15 100644 --- a/src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java +++ b/src/test/java/com/crewmeister/cmcodingchallenge/controllertests/CurrencyControllerTests.java @@ -1,5 +1,6 @@ package com.crewmeister.cmcodingchallenge.controllertests; +import com.crewmeister.cmcodingchallenge.security.MyUserDetailsService; import com.crewmeister.cmcodingchallenge.currency.CurrencyConstants; import com.crewmeister.cmcodingchallenge.currencycontroller.CurrencyController; import com.crewmeister.cmcodingchallenge.currencyservice.CurrencyService; @@ -11,6 +12,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import com.crewmeister.cmcodingchallenge.currency.Currency; import org.springframework.http.MediaType; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -29,10 +31,16 @@ public class CurrencyControllerTests { @MockBean CurrencyService currencyService; + @MockBean + private MyUserDetailsService userDetailsService; + + @MockBean + private PasswordEncoder passwordEncoder; + @Test public void testAddCurrencyWithNoCurrencies() throws Exception { mvc.perform(MockMvcRequestBuilders - .post("/api/addCurrencies") + .post("/cmfxapi/addCurrencies") .contentType(MediaType.APPLICATION_JSON) .content("{}") .accept(MediaType.APPLICATION_JSON)) @@ -51,7 +59,7 @@ public void testAddCurrencyWithInvalidInputCurrencies() throws Exception { "}"; mvc.perform(MockMvcRequestBuilders - .post("/api/addCurrencies") + .post("/cmfxapi/addCurrencies") .contentType(MediaType.APPLICATION_JSON) .content(payLoad) .accept(MediaType.APPLICATION_JSON)) @@ -74,7 +82,7 @@ public void testAddCurrencyWithValidInputCurrencies() throws Exception { "}"; mvc.perform(MockMvcRequestBuilders - .post("/api/addCurrencies") + .post("/cmfxapi/addCurrencies") .contentType(MediaType.APPLICATION_JSON) .content(payLoad) .accept(MediaType.APPLICATION_JSON)) @@ -92,7 +100,7 @@ void testGetAvailableCurrenciesFromDB() throws Exception { Mockito.when(currencyService.getListOfAvailableCurrencies()).thenReturn(currencyList); mvc.perform(MockMvcRequestBuilders - .get("/api/getAllAvailableCurrencies")) + .get("/cmfxapi/getAllAvailableCurrencies")) .andExpect(status().isOk()) .andExpect(content().string(expected)); } @@ -107,7 +115,7 @@ void testGetAvailableCurrenciesFromEnum() throws Exception { String expected = new ObjectMapper().writeValueAsString(enumCurrencies); mvc.perform(MockMvcRequestBuilders - .get("/api/getAllAvailableCurrencies") + .get("/cmfxapi/getAllAvailableCurrencies") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string(expected)); @@ -124,7 +132,7 @@ void testGetAllFXRatesWhenDateAndCurrencyAreNull() throws Exception { String expected = new ObjectMapper().writeValueAsString(fxRateMock); mvc.perform(MockMvcRequestBuilders - .get("/api/getAllFXRates") + .get("/cmfxapi/getAllFXRates") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string(expected)); @@ -142,7 +150,7 @@ void testGetAllFXRatesWhenDateExistsAndCurrencyIsNull() throws Exception { String expected = new ObjectMapper().writeValueAsString(fxRateMock); mvc.perform(MockMvcRequestBuilders - .get("/api/getAllFXRates") + .get("/cmfxapi/getAllFXRates") .param("date", date) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -160,7 +168,7 @@ void testGetAllFXRatesWhenDateisNullAndCurrencyExists() throws Exception { String expected = new ObjectMapper().writeValueAsString(fxRateMock); mvc.perform(MockMvcRequestBuilders - .get("/api/getAllFXRates") + .get("/cmfxapi/getAllFXRates") .param("currency", currency) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -179,7 +187,7 @@ void testGetAllFXRatesWhenDateAndCurrencyExists() throws Exception { String expected = new ObjectMapper().writeValueAsString(fxRateMock); mvc.perform(MockMvcRequestBuilders - .get("/api/getAllFXRates") + .get("/cmfxapi/getAllFXRates") .param("date", date) .param("currency", currency) .accept(MediaType.APPLICATION_JSON)) @@ -189,9 +197,9 @@ void testGetAllFXRatesWhenDateAndCurrencyExists() throws Exception { @Test void testGetAllFXRatesWithInvalidDateFormat() throws Exception { - String expected="{\"error\":\"Invalid value '05-05-2025' for parameter 'date'. Expected type: LocalDate\"}"; + String expected="{\"error\":\"Invalid value '05-05-2025' for parameter 'date'. Expected format is yyyy-MM-dd and type: LocalDate\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getAllFXRates") + .get("/cmfxapi/getAllFXRates") .param("date", "05-05-2025") // invalid format .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()) @@ -202,7 +210,7 @@ void testGetAllFXRatesWithInvalidDateFormat() throws Exception { void testGetFXAmountWithNullDateInput() throws Exception { String expected="{\"date\":\"Date is required\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "") .param("currency", "INR") .param("amount", "500.0")) @@ -214,7 +222,7 @@ void testGetFXAmountWithNullDateInput() throws Exception { void testGetFXAmountWithNullCurrencyInput() throws Exception { String expected="{\"currency\":\"Currency is required\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "2025-05-16") .param("currency", "") .param("amount", "500.0")) @@ -225,7 +233,7 @@ void testGetFXAmountWithNullCurrencyInput() throws Exception { void testGetFXAmountWithNullAmountInput() throws Exception { String expected="{\"amount\":\"Failed to convert property value of type 'java.lang.String' to required type 'double' for property 'amount'; nested exception is java.lang.NumberFormatException: empty String\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "2025-05-16") .param("currency", "INR") .param("amount", "")) @@ -236,7 +244,7 @@ void testGetFXAmountWithNullAmountInput() throws Exception { void testGetFXAmountWithInValidDateInput() throws Exception { String expected="{\"date\":\"Date must be a LocalDate in format yyyy-MM-dd\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "16-05-2025") .param("currency", "INR") .param("amount", "500.0")) @@ -247,7 +255,7 @@ void testGetFXAmountWithInValidDateInput() throws Exception { void testGetFXAmountWithInValidCurrencyInput() throws Exception { String expected="{\"currency\":\"Failed to convert property value of type 'java.lang.String' to required type 'com.crewmeister.cmcodingchallenge.currency.CurrencyConstants' for property 'currency'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@javax.validation.constraints.NotNull com.crewmeister.cmcodingchallenge.currency.CurrencyConstants] for value 'INS'; nested exception is java.lang.IllegalArgumentException: No enum constant com.crewmeister.cmcodingchallenge.currency.CurrencyConstants.INS\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "2025-05-16") .param("currency", "INS") .param("amount", "500.0")) @@ -258,7 +266,7 @@ void testGetFXAmountWithInValidCurrencyInput() throws Exception { void testGetFXAmountWithZeroAmountInput() throws Exception { String expected="{\"amount\":\"Amount must be a positive number\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "2025-05-16") .param("currency", "INR") .param("amount", "0")) @@ -270,7 +278,7 @@ void testGetFXAmountWithZeroAmountInput() throws Exception { void testGetFXAmountWithNegativeAmountInput() throws Exception { String expected="{\"amount\":\"Amount must be a positive number\"}"; mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "2025-05-16") .param("currency", "INR") .param("amount", "-500")) @@ -285,7 +293,7 @@ void testGetFXAmountWithValidInputs() throws Exception { .thenReturn(expectedAmount); mvc.perform(MockMvcRequestBuilders - .get("/api/getFXAmount") + .get("/cmfxapi/getFXAmount") .param("date", "2025-05-16") .param("currency", "INR") .param("amount", "500.0")) @@ -294,5 +302,12 @@ void testGetFXAmountWithValidInputs() throws Exception { } + @Test + void givenDifferentUrlRequiresAuthCheck() throws Exception { + mvc.perform(MockMvcRequestBuilders + .get("/secure/test")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/login")); + } }