From 8be5010f5d1d57667e7612f835d3ff591817ac0a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 13 Aug 2024 18:50:30 +0200 Subject: [PATCH 1/3] LocaleEditor supports BCP 47 language tags as well Closes gh-33348 --- .../springframework/beans/propertyeditors/LocaleEditor.java | 6 +++--- .../beans/propertyeditors/CustomEditorTests.java | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/LocaleEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/LocaleEditor.java index 5a327f710e0..c2c415deab5 100644 --- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/LocaleEditor.java +++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/LocaleEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,13 +30,13 @@ import org.springframework.util.StringUtils; * @author Juergen Hoeller * @since 26.05.2003 * @see java.util.Locale - * @see org.springframework.util.StringUtils#parseLocaleString + * @see org.springframework.util.StringUtils#parseLocale */ public class LocaleEditor extends PropertyEditorSupport { @Override public void setAsText(String text) { - setValue(StringUtils.parseLocaleString(text)); + setValue(StringUtils.parseLocale(text)); } @Override diff --git a/spring-beans/src/test/java/org/springframework/beans/propertyeditors/CustomEditorTests.java b/spring-beans/src/test/java/org/springframework/beans/propertyeditors/CustomEditorTests.java index 2e6f0394fd5..f3dd380be7b 100644 --- a/spring-beans/src/test/java/org/springframework/beans/propertyeditors/CustomEditorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/propertyeditors/CustomEditorTests.java @@ -648,6 +648,10 @@ class CustomEditorTests { assertThat(localeEditor.getValue()).isEqualTo(Locale.CANADA); assertThat(localeEditor.getAsText()).isEqualTo("en_CA"); + localeEditor = new LocaleEditor(); + localeEditor.setAsText("zh-Hans"); + assertThat(localeEditor.getValue()).isEqualTo(Locale.forLanguageTag("zh-Hans")); + localeEditor = new LocaleEditor(); assertThat(localeEditor.getAsText()).isEmpty(); } From d0bff584d7a2b276cb76669662189a5938be055a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 13 Aug 2024 18:51:02 +0200 Subject: [PATCH 2/3] Polishing --- .../aot/hint/BindingReflectionHintsRegistrar.java | 15 +++++++-------- .../org/springframework/http/CacheControl.java | 4 ++-- .../context/request/async/WebAsyncManager.java | 3 +-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java b/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java index d4951f15141..e4357496c16 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java @@ -54,8 +54,9 @@ public class BindingReflectionHintsRegistrar { private static final String JACKSON_ANNOTATION = "com.fasterxml.jackson.annotation.JacksonAnnotation"; - private static final boolean jacksonAnnotationPresent = ClassUtils.isPresent(JACKSON_ANNOTATION, - BindingReflectionHintsRegistrar.class.getClassLoader()); + private static final boolean jacksonAnnotationPresent = + ClassUtils.isPresent(JACKSON_ANNOTATION, BindingReflectionHintsRegistrar.class.getClassLoader()); + /** * Register the necessary reflection hints to bind the specified types. @@ -95,12 +96,10 @@ public class BindingReflectionHintsRegistrar { } } if (clazz.isEnum()) { - typeHint.withMembers( - MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, + typeHint.withMembers(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_PUBLIC_METHODS); } - typeHint.withMembers( - MemberCategory.DECLARED_FIELDS, + typeHint.withMembers(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); for (Method method : clazz.getMethods()) { String methodName = method.getName(); @@ -137,8 +136,7 @@ public class BindingReflectionHintsRegistrar { } private void registerPropertyHints(ReflectionHints hints, Set seen, @Nullable Method method, int parameterIndex) { - if (method != null && method.getDeclaringClass() != Object.class && - method.getDeclaringClass() != Enum.class) { + if (method != null && method.getDeclaringClass() != Object.class && method.getDeclaringClass() != Enum.class) { hints.registerMethod(method, ExecutableMode.INVOKE); MethodParameter methodParameter = MethodParameter.forExecutable(method, parameterIndex); Type methodParameterType = methodParameter.getGenericParameterType(); @@ -213,6 +211,7 @@ public class BindingReflectionHintsRegistrar { }); } + /** * Inner class to avoid a hard dependency on Kotlin at runtime. */ diff --git a/spring-web/src/main/java/org/springframework/http/CacheControl.java b/spring-web/src/main/java/org/springframework/http/CacheControl.java index 4cb693cf8f9..00b32d8aa48 100644 --- a/spring-web/src/main/java/org/springframework/http/CacheControl.java +++ b/spring-web/src/main/java/org/springframework/http/CacheControl.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -393,7 +393,7 @@ public class CacheControl { } private void appendDirective(StringBuilder builder, String value) { - if (builder.length() > 0) { + if (!builder.isEmpty()) { builder.append(", "); } builder.append(value); diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java index 1cfdeead2f5..d89ed4f35b1 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java @@ -245,8 +245,7 @@ public final class WebAsyncManager { } /** - * Mark the {@link WebAsyncManager} as wrapping a - * multipart async request. + * Mark the {@link WebAsyncManager} as wrapping a multipart async request. * @since 6.1.12 */ public void setMultipartRequestParsed(boolean isMultipart) { From 63486bf19cfb4d61004b565b08789fd12baaf0b4 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 13 Aug 2024 18:52:15 +0200 Subject: [PATCH 3/3] Upgrade to Tomcat 10.1.28, Jetty 12.0.12, Netty 4.1.112, Undertow 2.3.15 --- framework-platform/framework-platform.gradle | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/framework-platform/framework-platform.gradle b/framework-platform/framework-platform.gradle index 5392fe99669..e5562471fc6 100644 --- a/framework-platform/framework-platform.gradle +++ b/framework-platform/framework-platform.gradle @@ -9,15 +9,15 @@ javaPlatform { dependencies { api(platform("com.fasterxml.jackson:jackson-bom:2.15.4")) api(platform("io.micrometer:micrometer-bom:1.12.9")) - api(platform("io.netty:netty-bom:4.1.111.Final")) + api(platform("io.netty:netty-bom:4.1.112.Final")) api(platform("io.netty:netty5-bom:5.0.0.Alpha5")) api(platform("io.projectreactor:reactor-bom:2023.0.9")) api(platform("io.rsocket:rsocket-bom:1.1.3")) api(platform("org.apache.groovy:groovy-bom:4.0.22")) api(platform("org.apache.logging.log4j:log4j-bom:2.21.1")) api(platform("org.assertj:assertj-bom:3.26.0")) - api(platform("org.eclipse.jetty:jetty-bom:12.0.11")) - api(platform("org.eclipse.jetty.ee10:jetty-ee10-bom:12.0.11")) + api(platform("org.eclipse.jetty:jetty-bom:12.0.12")) + api(platform("org.eclipse.jetty.ee10:jetty-ee10-bom:12.0.12")) api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3")) api(platform("org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3")) api(platform("org.junit:junit-bom:5.10.3")) @@ -56,9 +56,9 @@ dependencies { api("io.r2dbc:r2dbc-spi:1.0.0.RELEASE") api("io.reactivex.rxjava3:rxjava:3.1.8") api("io.smallrye.reactive:mutiny:1.10.0") - api("io.undertow:undertow-core:2.3.14.Final") - api("io.undertow:undertow-servlet:2.3.14.Final") - api("io.undertow:undertow-websockets-jsr:2.3.14.Final") + api("io.undertow:undertow-core:2.3.15.Final") + api("io.undertow:undertow-servlet:2.3.15.Final") + api("io.undertow:undertow-websockets-jsr:2.3.15.Final") api("io.vavr:vavr:0.10.4") api("jakarta.activation:jakarta.activation-api:2.0.1") api("jakarta.annotation:jakarta.annotation-api:2.0.0") @@ -104,10 +104,10 @@ dependencies { api("org.apache.httpcomponents.client5:httpclient5:5.3.1") api("org.apache.httpcomponents.core5:httpcore5-reactive:5.2.5") api("org.apache.poi:poi-ooxml:5.2.5") - api("org.apache.tomcat.embed:tomcat-embed-core:10.1.25") - api("org.apache.tomcat.embed:tomcat-embed-websocket:10.1.25") - api("org.apache.tomcat:tomcat-util:10.1.25") - api("org.apache.tomcat:tomcat-websocket:10.1.25") + api("org.apache.tomcat.embed:tomcat-embed-core:10.1.28") + api("org.apache.tomcat.embed:tomcat-embed-websocket:10.1.28") + api("org.apache.tomcat:tomcat-util:10.1.28") + api("org.apache.tomcat:tomcat-websocket:10.1.28") api("org.aspectj:aspectjrt:1.9.22.1") api("org.aspectj:aspectjtools:1.9.22.1") api("org.aspectj:aspectjweaver:1.9.22.1")