T deserialize(String json, JavaType type) {
- try {
- return objectMapper.readValue(json.trim(), type);
- }
- catch (IOException ex) {
- throw new DockerOutputParseException(json, ex);
- }
+ return objectMapper.readValue(json.trim(), type);
}
}
diff --git a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java
index bc527a4747a..16f11ac79c8 100644
--- a/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java
+++ b/core/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/ConnectionNamePredicateTests.java
@@ -64,6 +64,7 @@ class ConnectionNamePredicateTests {
assertThat(predicateOf("redis")).accepts(sourceOf("myhost.com/library/redis"));
assertThat(predicateOf("redis")).accepts(sourceOf("myhost.com:8080/library/redis"));
assertThat(predicateOf("redis")).rejects(sourceOf("internalhost:8080/redis"));
+ assertThat(predicateOf("redis")).accepts(sourceOf("docker.my-company.com/library/redis:latest"));
}
@Test
diff --git a/core/spring-boot-test/build.gradle b/core/spring-boot-test/build.gradle
index d313430a47c..9bd3a3d4f17 100644
--- a/core/spring-boot-test/build.gradle
+++ b/core/spring-boot-test/build.gradle
@@ -27,7 +27,6 @@ dependencies {
api(project(":core:spring-boot"))
api("org.springframework:spring-test")
- optional("com.fasterxml.jackson.core:jackson-databind")
optional("com.google.code.gson:gson")
optional("com.jayway.jsonpath:json-path")
optional("io.projectreactor.netty:reactor-netty-http")
@@ -44,6 +43,7 @@ dependencies {
optional("org.springframework:spring-web")
optional("org.springframework:spring-webflux")
optional("org.springframework.graphql:spring-graphql-test")
+ optional("tools.jackson.core:jackson-databind")
testImplementation(project(":test-support:spring-boot-test-support"))
testImplementation("ch.qos.logback:logback-classic")
diff --git a/core/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java b/core/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java
index def26ddc435..b2cfbc0e80e 100644
--- a/core/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java
+++ b/core/spring-boot-test/src/main/java/org/springframework/boot/test/json/JacksonTester.java
@@ -18,16 +18,29 @@ package org.springframework.boot.test.json;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.Reader;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectReader;
-import com.fasterxml.jackson.databind.ObjectWriter;
import com.jayway.jsonpath.Configuration;
-import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
-import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
+import com.jayway.jsonpath.InvalidJsonException;
+import com.jayway.jsonpath.TypeRef;
+import com.jayway.jsonpath.spi.json.AbstractJsonProvider;
+import com.jayway.jsonpath.spi.mapper.MappingException;
+import com.jayway.jsonpath.spi.mapper.MappingProvider;
import org.jspecify.annotations.Nullable;
+import tools.jackson.core.JacksonException;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.JavaType;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectReader;
+import tools.jackson.databind.ObjectWriter;
+import tools.jackson.databind.json.JsonMapper;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.core.ResolvableType;
@@ -35,14 +48,14 @@ import org.springframework.util.Assert;
/**
* AssertJ based JSON tester backed by Jackson. Usually instantiated via
- * {@link #initFields(Object, ObjectMapper)}, for example:
+ * {@link #initFields(Object, JsonMapper)}, for example:
* public class ExampleObjectJsonTests {
*
* private JacksonTester<ExampleObject> json;
*
* @Before
* public void setup() {
- * ObjectMapper objectMapper = new ObjectMapper();
+ * JsonMapper jsonMapper = new JsonMapper();
* JacksonTester.initFields(this, objectMapper);
* }
*
@@ -65,42 +78,44 @@ import org.springframework.util.Assert;
*/
public class JacksonTester extends AbstractJsonMarshalTester {
- private final ObjectMapper objectMapper;
+ private final JsonMapper jsonMapper;
private @Nullable Class> view;
/**
* Create a new {@link JacksonTester} instance.
- * @param objectMapper the Jackson object mapper
+ * @param jsonMapper the Jackson JSON mapper
+ * @since 4.0.0
*/
- protected JacksonTester(ObjectMapper objectMapper) {
- Assert.notNull(objectMapper, "'objectMapper' must not be null");
- this.objectMapper = objectMapper;
+ protected JacksonTester(JsonMapper jsonMapper) {
+ Assert.notNull(jsonMapper, "'objectMapper' must not be null");
+ this.jsonMapper = jsonMapper;
}
/**
* Create a new {@link JacksonTester} instance.
* @param resourceLoadClass the source class used to load resources
* @param type the type under test
- * @param objectMapper the Jackson object mapper
+ * @param jsonMapper the Jackson JSON mapper
+ * @since 4.0.0
*/
- public JacksonTester(Class> resourceLoadClass, ResolvableType type, ObjectMapper objectMapper) {
- this(resourceLoadClass, type, objectMapper, null);
+ public JacksonTester(Class> resourceLoadClass, ResolvableType type, JsonMapper jsonMapper) {
+ this(resourceLoadClass, type, jsonMapper, null);
}
- public JacksonTester(Class> resourceLoadClass, ResolvableType type, ObjectMapper objectMapper,
+ public JacksonTester(Class> resourceLoadClass, ResolvableType type, JsonMapper jsonMapper,
@Nullable Class> view) {
super(resourceLoadClass, type);
- Assert.notNull(objectMapper, "'objectMapper' must not be null");
- this.objectMapper = objectMapper;
+ Assert.notNull(jsonMapper, "'jsonMapper' must not be null");
+ this.jsonMapper = jsonMapper;
this.view = view;
}
@Override
protected JsonContent getJsonContent(String json) {
Configuration configuration = Configuration.builder()
- .jsonProvider(new JacksonJsonProvider(this.objectMapper))
- .mappingProvider(new JacksonMappingProvider(this.objectMapper))
+ .jsonProvider(new JacksonJsonProvider(this.jsonMapper))
+ .mappingProvider(new JacksonMappingProvider(this.jsonMapper))
.build();
Class> resourceLoadClass = getResourceLoadClass();
Assert.state(resourceLoadClass != null, "'resourceLoadClass' must not be null");
@@ -118,7 +133,7 @@ public class JacksonTester extends AbstractJsonMarshalTester {
}
private ObjectReader getObjectReader(ResolvableType type) {
- ObjectReader objectReader = this.objectMapper.readerFor(getType(type));
+ ObjectReader objectReader = this.jsonMapper.readerFor(getType(type));
if (this.view != null) {
return objectReader.withView(this.view);
}
@@ -131,7 +146,7 @@ public class JacksonTester extends AbstractJsonMarshalTester {
}
private ObjectWriter getObjectWriter(ResolvableType type) {
- ObjectWriter objectWriter = this.objectMapper.writerFor(getType(type));
+ ObjectWriter objectWriter = this.jsonMapper.writerFor(getType(type));
if (this.view != null) {
return objectWriter.withView(this.view);
}
@@ -139,29 +154,31 @@ public class JacksonTester extends AbstractJsonMarshalTester {
}
private JavaType getType(ResolvableType type) {
- return this.objectMapper.constructType(type.getType());
+ return this.jsonMapper.constructType(type.getType());
}
/**
* Utility method to initialize {@link JacksonTester} fields. See {@link JacksonTester
* class-level documentation} for example usage.
* @param testInstance the test instance
- * @param objectMapper the object mapper
- * @see #initFields(Object, ObjectMapper)
+ * @param jsonMapper the JSON mapper
+ * @since 4.0.0
+ * @see #initFields(Object, JsonMapper)
*/
- public static void initFields(Object testInstance, ObjectMapper objectMapper) {
- new JacksonFieldInitializer().initFields(testInstance, objectMapper);
+ public static void initFields(Object testInstance, JsonMapper jsonMapper) {
+ new JacksonFieldInitializer().initFields(testInstance, jsonMapper);
}
/**
* Utility method to initialize {@link JacksonTester} fields. See {@link JacksonTester
* class-level documentation} for example usage.
* @param testInstance the test instance
- * @param objectMapperFactory a factory to create the object mapper
- * @see #initFields(Object, ObjectMapper)
+ * @param jsonMapperFactory a factory to create the JSON mapper
+ * @since 4.0.0
+ * @see #initFields(Object, JsonMapper)
*/
- public static void initFields(Object testInstance, ObjectFactory objectMapperFactory) {
- new JacksonFieldInitializer().initFields(testInstance, objectMapperFactory);
+ public static void initFields(Object testInstance, ObjectFactory jsonMapperFactory) {
+ new JacksonFieldInitializer().initFields(testInstance, jsonMapperFactory);
}
/**
@@ -175,13 +192,13 @@ public class JacksonTester extends AbstractJsonMarshalTester {
ResolvableType type = getType();
Assert.state(resourceLoadClass != null, "'resourceLoadClass' must not be null");
Assert.state(type != null, "'type' must not be null");
- return new JacksonTester<>(resourceLoadClass, type, this.objectMapper, view);
+ return new JacksonTester<>(resourceLoadClass, type, this.jsonMapper, view);
}
/**
* {@link FieldInitializer} for Jackson.
*/
- private static class JacksonFieldInitializer extends FieldInitializer {
+ private static class JacksonFieldInitializer extends FieldInitializer {
protected JacksonFieldInitializer() {
super(JacksonTester.class);
@@ -189,10 +206,115 @@ public class JacksonTester extends AbstractJsonMarshalTester {
@Override
protected AbstractJsonMarshalTester