Browse Source

Deprecate Base64Utils in favor of Java's Base64

Originally, `Base64Utils` was providing base64 encoding and decoding
utilities, bridging to commons-codecs or Java 8, if available. Since
then, only the Java 8 variant remains and Spring Framework 6 requires
now Java 17. This utility class doesn't provide additional checks or
syntactic sugar over what's in Java already.

As a result, this commit deprecates this class in favor of `Base64` and
schedules the removal of this class completely.

Closes gh-28434
pull/29837/head
Brian Clozel 3 years ago
parent
commit
5448e81021
  1. 4
      spring-core/src/main/java/org/springframework/util/Base64Utils.java
  2. 101
      spring-core/src/test/java/org/springframework/util/Base64UtilsTests.java
  3. 9
      spring-web/src/main/java/org/springframework/http/converter/json/GsonBuilderUtils.java

4
spring-core/src/main/java/org/springframework/util/Base64Utils.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2019 the original author or authors.
* Copyright 2002-2023 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.
@ -27,7 +27,9 @@ import java.util.Base64; @@ -27,7 +27,9 @@ import java.util.Base64;
* @author Gary Russell
* @since 4.1
* @see java.util.Base64
* @deprecated as of Spring Framework 6.0.5 in favor of {@link Base64}.
*/
@Deprecated(since = "6.0.5", forRemoval = true)
public abstract class Base64Utils {
/**

101
spring-core/src/test/java/org/springframework/util/Base64UtilsTests.java

@ -1,101 +0,0 @@ @@ -1,101 +0,0 @@
/*
* Copyright 2002-2019 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.util;
import jakarta.xml.bind.DatatypeConverter;
import org.junit.jupiter.api.Test;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Juergen Hoeller
* @since 4.2
*/
class Base64UtilsTests {
@Test
void encode() {
byte[] bytes = new byte[]
{-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b};
assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes);
bytes = "Hello World".getBytes(UTF_8);
assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes);
bytes = "Hello World\r\nSecond Line".getBytes(UTF_8);
assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes);
bytes = "Hello World\r\nSecond Line\r\n".getBytes(UTF_8);
assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes);
bytes = new byte[] { (byte) 0xfb, (byte) 0xf0 };
assertThat(Base64Utils.encode(bytes)).isEqualTo("+/A=".getBytes());
assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes);
assertThat(Base64Utils.encodeUrlSafe(bytes)).isEqualTo("-_A=".getBytes());
assertThat(Base64Utils.decodeUrlSafe(Base64Utils.encodeUrlSafe(bytes))).isEqualTo(bytes);
}
@Test
void encodeToStringWithJdk8VsJaxb() {
byte[] bytes = new byte[]
{-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b};
assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes));
assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes);
assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes);
bytes = "Hello World".getBytes(UTF_8);
assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes));
assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes);
assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes);
bytes = "Hello World\r\nSecond Line".getBytes(UTF_8);
assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes));
assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes);
assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes);
bytes = "Hello World\r\nSecond Line\r\n".getBytes(UTF_8);
assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes));
assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes);
assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes);
}
@Test
void encodeDecodeUrlSafe() {
byte[] bytes = new byte[] { (byte) 0xfb, (byte) 0xf0 };
assertThat(Base64Utils.encodeUrlSafe(bytes)).isEqualTo("-_A=".getBytes());
assertThat(Base64Utils.decodeUrlSafe(Base64Utils.encodeUrlSafe(bytes))).isEqualTo(bytes);
assertThat(Base64Utils.encodeToUrlSafeString(bytes)).isEqualTo("-_A=");
assertThat(Base64Utils.decodeFromUrlSafeString(Base64Utils.encodeToUrlSafeString(bytes))).isEqualTo(bytes);
}
@Test
void emptyInputs() {
assertThat(Base64Utils.encode(new byte[0])).isEmpty();
assertThat(Base64Utils.encodeToString(new byte[0])).isEmpty();
assertThat(Base64Utils.encodeUrlSafe(new byte[0])).isEmpty();
assertThat(Base64Utils.encodeToUrlSafeString(new byte[0])).isEmpty();
assertThat(Base64Utils.decode(new byte[0])).isEmpty();
assertThat(Base64Utils.decodeFromString("")).isEmpty();
assertThat(Base64Utils.decodeUrlSafe(new byte[0])).isEmpty();
assertThat(Base64Utils.decodeFromUrlSafeString("")).isEmpty();
}
}

9
spring-web/src/main/java/org/springframework/http/converter/json/GsonBuilderUtils.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2023 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.
@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package org.springframework.http.converter.json;
import java.lang.reflect.Type;
import java.util.Base64;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
@ -26,7 +27,6 @@ import com.google.gson.JsonPrimitive; @@ -26,7 +27,6 @@ import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import org.springframework.util.Base64Utils;
/**
* A simple utility class for obtaining a Google Gson 2.x {@link GsonBuilder}
@ -36,7 +36,6 @@ import org.springframework.util.Base64Utils; @@ -36,7 +36,6 @@ import org.springframework.util.Base64Utils;
* @author Roy Clarkson
* @since 4.1
* @see GsonFactoryBean#setBase64EncodeByteArrays
* @see org.springframework.util.Base64Utils
*/
public abstract class GsonBuilderUtils {
@ -59,12 +58,12 @@ public abstract class GsonBuilderUtils { @@ -59,12 +58,12 @@ public abstract class GsonBuilderUtils {
@Override
public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(Base64Utils.encodeToString(src));
return new JsonPrimitive(Base64.getEncoder().encodeToString(src));
}
@Override
public byte[] deserialize(JsonElement json, Type type, JsonDeserializationContext cxt) {
return Base64Utils.decodeFromString(json.getAsString());
return Base64.getDecoder().decode(json.getAsString());
}
}

Loading…
Cancel
Save