diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/DurationFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/DurationFormatter.java index 96b749dbfc3..a4674157a60 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/DurationFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/DurationFormatter.java @@ -31,7 +31,7 @@ import org.springframework.format.Formatter; * @since 4.2.4 * @see Duration#parse */ -public class DurationFormatter implements Formatter { +class DurationFormatter implements Formatter { @Override public Duration parse(String text, Locale locale) throws ParseException { diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeFormatterRegistrar.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeFormatterRegistrar.java index 198fd8630d3..9c57310f733 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeFormatterRegistrar.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/JodaTimeFormatterRegistrar.java @@ -38,6 +38,7 @@ import org.springframework.format.FormatterRegistry; import org.springframework.format.Parser; import org.springframework.format.Printer; import org.springframework.format.annotation.DateTimeFormat.ISO; +import org.springframework.util.ClassUtils; /** * Configures Joda-Time's formatting system for use with Spring. @@ -61,6 +62,14 @@ public class JodaTimeFormatterRegistrar implements FormatterRegistrar { private enum Type {DATE, TIME, DATE_TIME} + /** + * Strictly speaking, this should not be necessary since we formally require JodaTime 2.x. + * However, since Joda-Time formatters are being registered automatically, we defensively + * adapt to Joda-Time 1.x when encountered on the classpath. To be removed in Spring 5.0. + */ + private static final boolean jodaTime2Available = ClassUtils.isPresent( + "org.joda.time.YearMonth", JodaTimeFormatterRegistrar.class.getClassLoader()); + /** * User defined formatters. */ @@ -200,8 +209,9 @@ public class JodaTimeFormatterRegistrar implements FormatterRegistrar { registry.addFormatterForFieldType(Period.class, new PeriodFormatter()); registry.addFormatterForFieldType(Duration.class, new DurationFormatter()); - registry.addFormatterForFieldType(YearMonth.class, new YearMonthFormatter()); - registry.addFormatterForFieldType(MonthDay.class, new MonthDayFormatter()); + if (jodaTime2Available) { + JodaTime2Delegate.registerAdditionalFormatters(registry); + } registry.addFormatterForFieldAnnotation(new JodaDateTimeFormatAnnotationFormatterFactory()); } @@ -231,4 +241,16 @@ public class JodaTimeFormatterRegistrar implements FormatterRegistrar { } } + + /** + * Inner class to avoid a hard dependency on Joda-Time 2.x. + */ + private static class JodaTime2Delegate { + + public static void registerAdditionalFormatters(FormatterRegistry registry) { + registry.addFormatterForFieldType(YearMonth.class, new YearMonthFormatter()); + registry.addFormatterForFieldType(MonthDay.class, new MonthDayFormatter()); + } + } + } diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/MonthDayFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/MonthDayFormatter.java index b1e3e9560a8..44cb733991a 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/MonthDayFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/MonthDayFormatter.java @@ -31,7 +31,7 @@ import org.springframework.format.Formatter; * @since 4.2.4 * @see MonthDay#parse */ -public class MonthDayFormatter implements Formatter { +class MonthDayFormatter implements Formatter { @Override public MonthDay parse(String text, Locale locale) throws ParseException { diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/PeriodFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/PeriodFormatter.java index 1dab115c36d..12fe101ee51 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/PeriodFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/PeriodFormatter.java @@ -31,7 +31,7 @@ import org.springframework.format.Formatter; * @since 4.2.4 * @see Period#parse */ -public class PeriodFormatter implements Formatter { +class PeriodFormatter implements Formatter { @Override public Period parse(String text, Locale locale) throws ParseException { diff --git a/spring-context/src/main/java/org/springframework/format/datetime/joda/YearMonthFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/joda/YearMonthFormatter.java index 7d94e53f232..f0cf89753cc 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/joda/YearMonthFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/joda/YearMonthFormatter.java @@ -31,7 +31,7 @@ import org.springframework.format.Formatter; * @since 4.2.4 * @see YearMonth#parse */ -public class YearMonthFormatter implements Formatter { +class YearMonthFormatter implements Formatter { @Override public YearMonth parse(String text, Locale locale) throws ParseException { diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/DurationFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/DurationFormatter.java index 77f93a3a70f..57764143123 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/DurationFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/DurationFormatter.java @@ -32,7 +32,7 @@ import org.springframework.lang.UsesJava8; * @see Duration#parse */ @UsesJava8 -public class DurationFormatter implements Formatter { +class DurationFormatter implements Formatter { @Override public Duration parse(String text, Locale locale) throws ParseException { diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/MonthDayFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/MonthDayFormatter.java index 029bb76c378..41a36f9fd34 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/MonthDayFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/MonthDayFormatter.java @@ -32,7 +32,7 @@ import org.springframework.lang.UsesJava8; * @see MonthDay#parse */ @UsesJava8 -public class MonthDayFormatter implements Formatter { +class MonthDayFormatter implements Formatter { @Override public MonthDay parse(String text, Locale locale) throws ParseException { diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/PeriodFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/PeriodFormatter.java index 0c158eac211..5ac4fbff32a 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/PeriodFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/PeriodFormatter.java @@ -33,7 +33,7 @@ import org.springframework.lang.UsesJava8; * @see Period#parse */ @UsesJava8 -public class PeriodFormatter implements Formatter { +class PeriodFormatter implements Formatter { @Override public Period parse(String text, Locale locale) throws ParseException { diff --git a/spring-context/src/main/java/org/springframework/format/datetime/standard/YearMonthFormatter.java b/spring-context/src/main/java/org/springframework/format/datetime/standard/YearMonthFormatter.java index 5b278494d57..402f77df4f3 100644 --- a/spring-context/src/main/java/org/springframework/format/datetime/standard/YearMonthFormatter.java +++ b/spring-context/src/main/java/org/springframework/format/datetime/standard/YearMonthFormatter.java @@ -32,7 +32,7 @@ import org.springframework.lang.UsesJava8; * @see YearMonth#parse */ @UsesJava8 -public class YearMonthFormatter implements Formatter { +class YearMonthFormatter implements Formatter { @Override public YearMonth parse(String text, Locale locale) throws ParseException {