From 395ddd8bfe7ee21e570cb62ac99ea9399c8ff958 Mon Sep 17 00:00:00 2001 From: AlbertLovers Date: Mon, 29 Dec 2025 23:16:22 +0100 Subject: [PATCH 1/2] Update JavaTimeModule.java Validate the order of the argument types against the order of the parameters. The previous version ignored mismatches and returned the first method with the correct name and correct number of parameters regardless of parameter types. --- .../datatype/jsr310/JavaTimeModule.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java index 575d53c4..51cd2a1f 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java @@ -270,17 +270,25 @@ protected AnnotatedMethod _findFactory(AnnotatedClass cls, String name, Class || (method.getParameterCount() != argCount)) { continue; } - for (int i = 0; i < argCount; ++i) { - Class argType = method.getParameter(i).getRawType(); - if (!argType.isAssignableFrom(argTypes[i])) { - continue; - } + if (!allArgTypesMatch(argTypes, method)) { + continue; } return method; } return null; } + private boolean allArgTypesMatch(Class[] expectedArgTypes, AnnotatedMethod method) + { + for (int i = 0; i < expectedArgTypes.length; ++i) { + Class argType = method.getParameter(i).getRawType(); + if (!argType.isAssignableFrom(expectedArgTypes[i])) { + return false; + } + } + return true; + } + /** * Container for serializers, with one tweak; specific lookup we need to deal * with specific {@code TemporalAdjuster} closure subtypes. From 8d70fb9dd7e2c0a0a116289df891021be41fcddb Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 30 Dec 2025 18:00:50 -0800 Subject: [PATCH 2/2] Add release notes, minor style change --- .../jackson/datatype/jsr310/JavaTimeModule.java | 16 +++++++--------- release-notes/CREDITS-2.x | 6 +++++- release-notes/VERSION-2.x | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java index 51cd2a1f..ae953380 100644 --- a/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java +++ b/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java @@ -266,21 +266,19 @@ protected AnnotatedMethod _findFactory(AnnotatedClass cls, String name, Class { final int argCount = argTypes.length; for (AnnotatedMethod method : cls.getFactoryMethods()) { - if (!name.equals(method.getName()) - || (method.getParameterCount() != argCount)) { - continue; + if (name.equals(method.getName()) + && (method.getParameterCount() == argCount) + && _allArgTypesMatch(argTypes, method)) { + return method; } - if (!allArgTypesMatch(argTypes, method)) { - continue; - } - return method; } return null; } - private boolean allArgTypesMatch(Class[] expectedArgTypes, AnnotatedMethod method) + // @since 2.21 + private boolean _allArgTypesMatch(Class[] expectedArgTypes, AnnotatedMethod method) { - for (int i = 0; i < expectedArgTypes.length; ++i) { + for (int i = 0, len = expectedArgTypes.length; i < len; ++i) { Class argType = method.getParameter(i).getRawType(); if (!argType.isAssignableFrom(expectedArgTypes[i])) { return false; diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index f75b3900..58147120 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -222,7 +222,7 @@ Joey Muia (@jmuia) `WRITE_DURATIONS_AS_TIMESTAMPS` enabled (2.19.0) -Henning Pöttker (@ hpoettker) +Henning Pöttker (@hpoettker) * Contributed #342: Lenient deserialization of `LocalDate` is not time-zone aware (2.19.0) @@ -230,3 +230,7 @@ Boleslav Bobcik (@bbobcik) * Reported, contributed fix for #364: Deserialization of Month in ONE_BASED_MONTHS mode fails for value "12" (2.19.0) + +Albert Lovers (@AlbertLovers) + * Reported, contributed fix for #381: Fix a potential problem in `JavaTimeModule._findFactory()` + (2.21.0) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 63ec26b5..863d16ad 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -17,8 +17,8 @@ Modules: #376: Allow specifying custom `DateTimeFormatter` for `OffsetDateTime` ser/deser (new constructors?) (requested by @ZIRAKrezovic) - -No changes since 2.20 +#381: Fix a potential problem in `JavaTimeModule._findFactory()` + (reported, fix by, Albert L) 2.20.1 (30-Oct-2025) 2.20.0 (28-Aug-2025)