From 621295dbd8e53dd66901348e6f23fbdfd78b8b22 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 21 Oct 2020 16:09:26 +0200 Subject: [PATCH] Deprecate StringUtils.isEmpty(Object) and replace remaining usage Closes gh-25945 --- .../QualifierAnnotationAutowireCandidateResolver.java | 5 ++--- .../src/main/java/org/springframework/util/ObjectUtils.java | 1 - .../src/main/java/org/springframework/util/StringUtils.java | 5 +++-- .../java/org/springframework/expression/spel/ast/Elvis.java | 3 +-- .../messaging/simp/stomp/DefaultStompSession.java | 3 ++- .../converter/json/Jackson2ObjectMapperBuilderTests.java | 5 ++--- .../method/annotation/RequestPartMethodArgumentResolver.java | 4 ++-- .../org/springframework/web/reactive/socket/CloseStatus.java | 2 +- 8 files changed, 13 insertions(+), 15 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java index 3a3b0944c23..e4e104b4c8e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/QualifierAnnotationAutowireCandidateResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 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. @@ -40,7 +40,6 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; /** * {@link AutowireCandidateResolver} implementation that matches bean definition qualifiers @@ -188,7 +187,7 @@ public class QualifierAnnotationAutowireCandidateResolver extends GenericTypeAwa foundMeta = true; // Only accept fallback match if @Qualifier annotation has a value... // Otherwise it is just a marker for a custom qualifier annotation. - if ((fallbackToMeta && StringUtils.isEmpty(AnnotationUtils.getValue(metaAnn))) || + if ((fallbackToMeta && ObjectUtils.isEmpty(AnnotationUtils.getValue(metaAnn))) || !checkQualifier(bdHolder, metaAnn, typeConverter)) { return false; } diff --git a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java index 83428aa32a0..8089a1313e7 100644 --- a/spring-core/src/main/java/org/springframework/util/ObjectUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ObjectUtils.java @@ -128,7 +128,6 @@ public abstract class ObjectUtils { * @see Optional#isPresent() * @see ObjectUtils#isEmpty(Object[]) * @see StringUtils#hasLength(CharSequence) - * @see StringUtils#isEmpty(Object) * @see CollectionUtils#isEmpty(java.util.Collection) * @see CollectionUtils#isEmpty(java.util.Map) */ diff --git a/spring-core/src/main/java/org/springframework/util/StringUtils.java b/spring-core/src/main/java/org/springframework/util/StringUtils.java index 75dcdbfa3a9..6d6d577cc51 100644 --- a/spring-core/src/main/java/org/springframework/util/StringUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StringUtils.java @@ -91,9 +91,10 @@ public abstract class StringUtils { * {@link #hasLength(String)} or {@link #hasText(String)} instead. * @param str the candidate object (possibly a {@code String}) * @since 3.2.1 - * @see #hasLength(String) - * @see #hasText(String) + * @deprecated as of 5.3, in favor of {@link #hasLength(String)} and + * {@link #hasText(String)} (or {@link ObjectUtils#isEmpty(Object)}) */ + @Deprecated public static boolean isEmpty(@Nullable Object str) { return (str == null || "".equals(str)); } diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Elvis.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Elvis.java index 3cac922d2bf..60b313e90a9 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/Elvis.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/Elvis.java @@ -24,7 +24,6 @@ import org.springframework.expression.spel.CodeFlow; import org.springframework.expression.spel.ExpressionState; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; /** * Represents the elvis operator ?:. For an expression "a?:b" if a is not null, the value @@ -52,7 +51,7 @@ public class Elvis extends SpelNodeImpl { public TypedValue getValueInternal(ExpressionState state) throws EvaluationException { TypedValue value = this.children[0].getValueInternal(state); // If this check is changed, the generateCode method will need changing too - if (!StringUtils.isEmpty(value.getValue())) { + if (value.getValue() != null && !"".equals(value.getValue())) { return value; } else { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java index f54dc05e208..391325f443d 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java @@ -45,6 +45,7 @@ import org.springframework.scheduling.TaskScheduler; import org.springframework.util.AlternativeJdkIdGenerator; import org.springframework.util.Assert; import org.springframework.util.IdGenerator; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureCallback; @@ -263,7 +264,7 @@ public class DefaultStompSession implements ConnectionHandlingStompSession { private Message createMessage(StompHeaderAccessor accessor, @Nullable Object payload) { accessor.updateSimpMessageHeadersFromStompHeaders(); Message message; - if (StringUtils.isEmpty(payload) || (payload instanceof byte[] && ((byte[]) payload).length == 0)) { + if (ObjectUtils.isEmpty(payload)) { message = MessageBuilder.createMessage(EMPTY_PAYLOAD, accessor.getMessageHeaders()); } else { diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java index b69ebfe3f47..32a93851ba4 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/Jackson2ObjectMapperBuilderTests.java @@ -683,13 +683,12 @@ class Jackson2ObjectMapperBuilderTests { @Override public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { - final String value = jsonParser.getValueAsString(); - if (StringUtils.isEmpty(value)) { + String value = jsonParser.getValueAsString(); + if (!StringUtils.hasLength(value)) { return null; } try { return OffsetDateTime.parse(value); - } catch (DateTimeParseException exception) { return OffsetDateTime.parse(value + CURRENT_ZONE_OFFSET); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestPartMethodArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestPartMethodArgumentResolver.java index 555d5b076cb..e045c79f6a6 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestPartMethodArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestPartMethodArgumentResolver.java @@ -129,10 +129,10 @@ public class RequestPartMethodArgumentResolver extends AbstractMessageReaderArgu if (requestPart != null) { name = requestPart.name(); } - if (StringUtils.isEmpty(name)) { + if (!StringUtils.hasLength(name)) { name = methodParam.getParameterName(); } - if (StringUtils.isEmpty(name)) { + if (!StringUtils.hasLength(name)) { throw new IllegalArgumentException("Request part name for argument type [" + methodParam.getNestedParameterType().getName() + "] not specified, and parameter name information not found in class file either."); diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java index 63ffbf09f39..304eb797d79 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java @@ -200,7 +200,7 @@ public final class CloseStatus { * @since 5.3 */ public static CloseStatus create(int code, @Nullable String reason) { - if (StringUtils.isEmpty(reason)) { + if (!StringUtils.hasText(reason)) { switch (code) { case 1000: return NORMAL;