From 533acce8e212a792a48323d2174955ae7ff4d9d3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 15:45:02 +0000 Subject: [PATCH 1/2] Initial plan From 902bbb1c5992015e7afc3e21279e724b19bcd0fd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Mar 2026 15:54:21 +0000 Subject: [PATCH 2/2] Fix DateTimeParseException for malformed date query params Co-authored-by: lukepring <68820847+lukepring@users.noreply.github.com> --- .../presentation/WebPageController.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/stockscope/src/main/java/com/sharecomparison/presentation/WebPageController.java b/stockscope/src/main/java/com/sharecomparison/presentation/WebPageController.java index 78ff57d..fde285d 100644 --- a/stockscope/src/main/java/com/sharecomparison/presentation/WebPageController.java +++ b/stockscope/src/main/java/com/sharecomparison/presentation/WebPageController.java @@ -7,10 +7,13 @@ import java.util.List; import java.util.Map; // or GetMapping if form is GET +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import com.sharecomparison.application.MarketDataService; import com.sharecomparison.domain.PriceData; @@ -38,12 +41,12 @@ public String showForm(Model model) { public String compare( @RequestParam String symbol1, @RequestParam String symbol2, - @RequestParam(required = false) String startDate, - @RequestParam(required = false) String endDate, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate, Model model) { - LocalDate start = (startDate != null && !startDate.isBlank()) ? LocalDate.parse(startDate) : LocalDate.now().minusYears(1); - LocalDate end = (endDate != null && !endDate.isBlank()) ? LocalDate.parse(endDate) : LocalDate.now(); + LocalDate start = (startDate != null) ? startDate : LocalDate.now().minusYears(1); + LocalDate end = (endDate != null) ? endDate : LocalDate.now(); symbol1 = symbol1.trim().toUpperCase(); symbol2 = symbol2.trim().toUpperCase(); @@ -131,4 +134,21 @@ public String compare( return "index"; } + + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public String handleDateParseError(MethodArgumentTypeMismatchException ex, Model model) { + String paramName = ex.getName(); + if (LocalDate.class.equals(ex.getRequiredType()) + && ("startDate".equals(paramName) || "endDate".equals(paramName))) { + model.addAttribute("error", + "Invalid date format for '" + paramName + "'. Please use YYYY-MM-DD (e.g. 2024-01-15)."); + } else { + model.addAttribute("error", "Invalid value for parameter '" + paramName + "'."); + } + model.addAttribute("symbol1", "AAPL"); + model.addAttribute("symbol2", "MSFT"); + model.addAttribute("startDate", LocalDate.now().minusYears(1).toString()); + model.addAttribute("endDate", LocalDate.now().toString()); + return "index"; + } } \ No newline at end of file