diff --git a/pom.xml b/pom.xml index ef1e17a1..b5c50b0f 100644 --- a/pom.xml +++ b/pom.xml @@ -56,19 +56,14 @@ 4.0.2 - com.fasterxml.jackson.core + tools.jackson.core jackson-databind - 2.21.1 - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - 2.21.1 + 3.0.0 - com.fasterxml.jackson.core + tools.jackson.core jackson-core - 2.21.1 + 3.0.0 com.fasterxml.jackson.core @@ -82,9 +77,9 @@ test - com.fasterxml.jackson.jr + tools.jackson.jr jackson-jr-objects - 2.21.1 + 3.0.0 test diff --git a/src/main/java/com/maxmind/geoip2/InetAddressDeserializer.java b/src/main/java/com/maxmind/geoip2/InetAddressDeserializer.java index 8c61609b..57936cdb 100644 --- a/src/main/java/com/maxmind/geoip2/InetAddressDeserializer.java +++ b/src/main/java/com/maxmind/geoip2/InetAddressDeserializer.java @@ -1,11 +1,12 @@ package com.maxmind.geoip2; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; -import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.deser.std.StdDeserializer; /** * Deserializes a string to an InetAddress. @@ -20,7 +21,7 @@ public InetAddressDeserializer() { @Override public InetAddress deserialize(JsonParser p, DeserializationContext ctxt) - throws IOException { + throws JacksonException { var value = p.getValueAsString(); if (value == null || value.isEmpty()) { return null; @@ -28,7 +29,7 @@ public InetAddress deserialize(JsonParser p, DeserializationContext ctxt) try { return InetAddress.getByName(value); } catch (UnknownHostException e) { - throw new IOException("Invalid IP address: " + value, e); + throw DatabindException.from(p, "Invalid IP address: " + value, e); } } } diff --git a/src/main/java/com/maxmind/geoip2/InetAddressModule.java b/src/main/java/com/maxmind/geoip2/InetAddressModule.java index 6b989a4a..169c3af8 100644 --- a/src/main/java/com/maxmind/geoip2/InetAddressModule.java +++ b/src/main/java/com/maxmind/geoip2/InetAddressModule.java @@ -1,7 +1,7 @@ package com.maxmind.geoip2; -import com.fasterxml.jackson.databind.module.SimpleModule; import java.net.InetAddress; +import tools.jackson.databind.module.SimpleModule; /** * Jackson module for InetAddress serialization and deserialization. diff --git a/src/main/java/com/maxmind/geoip2/InetAddressSerializer.java b/src/main/java/com/maxmind/geoip2/InetAddressSerializer.java index 38319841..4c5f4c6b 100644 --- a/src/main/java/com/maxmind/geoip2/InetAddressSerializer.java +++ b/src/main/java/com/maxmind/geoip2/InetAddressSerializer.java @@ -1,10 +1,10 @@ package com.maxmind.geoip2; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; -import java.io.IOException; import java.net.InetAddress; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ser.std.StdSerializer; /** * Serializes InetAddress to its host address string representation. @@ -18,8 +18,8 @@ public InetAddressSerializer() { } @Override - public void serialize(InetAddress value, JsonGenerator gen, SerializerProvider provider) - throws IOException { + public void serialize(InetAddress value, JsonGenerator gen, SerializationContext provider) + throws JacksonException { if (value == null) { gen.writeNull(); } else { diff --git a/src/main/java/com/maxmind/geoip2/JsonSerializable.java b/src/main/java/com/maxmind/geoip2/JsonSerializable.java index a10a6a88..29eb2bb9 100644 --- a/src/main/java/com/maxmind/geoip2/JsonSerializable.java +++ b/src/main/java/com/maxmind/geoip2/JsonSerializable.java @@ -1,11 +1,8 @@ package com.maxmind.geoip2; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import java.io.IOException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.json.JsonMapper; /** * Interface for classes that can be serialized to JSON. @@ -16,16 +13,14 @@ public interface JsonSerializable { /** * @return JSON representation of this object. The structure is the same as * the JSON provided by the GeoIP2 web service. - * @throws IOException if there is an error serializing the object to JSON. */ - default String toJson() throws IOException { + default String toJson() { JsonMapper mapper = JsonMapper.builder() - .disable(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .addModule(new JavaTimeModule()) + .disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES) .addModule(new InetAddressModule()) - .serializationInclusion(JsonInclude.Include.NON_NULL) - .serializationInclusion(JsonInclude.Include.NON_EMPTY) + .changeDefaultPropertyInclusion( + value -> value.withValueInclusion(JsonInclude.Include.NON_NULL) + .withValueInclusion(JsonInclude.Include.NON_EMPTY)) .build(); return mapper.writeValueAsString(this); diff --git a/src/main/java/com/maxmind/geoip2/NetworkDeserializer.java b/src/main/java/com/maxmind/geoip2/NetworkDeserializer.java index 670ddc52..e5b85bd2 100644 --- a/src/main/java/com/maxmind/geoip2/NetworkDeserializer.java +++ b/src/main/java/com/maxmind/geoip2/NetworkDeserializer.java @@ -1,12 +1,13 @@ package com.maxmind.geoip2; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.maxmind.db.Network; -import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DatabindException; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.deser.std.StdDeserializer; /** * This class provides a deserializer for the Network class. @@ -17,7 +18,7 @@ public final class NetworkDeserializer extends StdDeserializer { * Constructs a {@code NetworkDeserializer} with no type specified. */ public NetworkDeserializer() { - this(null); + this(Network.class); } /** @@ -31,16 +32,20 @@ public NetworkDeserializer(Class vc) { @Override public Network deserialize(JsonParser jsonparser, DeserializationContext context) - throws IOException { + throws JacksonException { final var cidr = jsonparser.getValueAsString(); if (cidr == null || cidr.isBlank()) { return null; } - return parseCidr(cidr); + try { + return parseCidr(cidr); + } catch (UnknownHostException e) { + throw DatabindException.from(jsonparser, "Unknown host in CIDR: " + cidr, e); + } } - private static Network parseCidr(String cidr) throws IOException { + private static Network parseCidr(String cidr) throws UnknownHostException { final var parts = cidr.split("/", 2); if (parts.length != 2) { throw new IllegalArgumentException("Invalid CIDR format: " + cidr); @@ -49,12 +54,7 @@ private static Network parseCidr(String cidr) throws IOException { final var addrPart = parts[0]; final var prefixPart = parts[1]; - final InetAddress address; - try { - address = InetAddress.getByName(addrPart); - } catch (UnknownHostException e) { - throw new IOException("Unknown host in CIDR: " + cidr, e); - } + final InetAddress address = InetAddress.getByName(addrPart); final var prefixLength = parsePrefixLength(prefixPart, cidr); diff --git a/src/main/java/com/maxmind/geoip2/WebServiceClient.java b/src/main/java/com/maxmind/geoip2/WebServiceClient.java index 125a3af9..21ecb842 100644 --- a/src/main/java/com/maxmind/geoip2/WebServiceClient.java +++ b/src/main/java/com/maxmind/geoip2/WebServiceClient.java @@ -1,13 +1,5 @@ package com.maxmind.geoip2; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.InjectableValues; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.maxmind.geoip2.exception.AddressNotFoundException; import com.maxmind.geoip2.exception.AuthenticationException; import com.maxmind.geoip2.exception.GeoIp2Exception; @@ -21,7 +13,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; -import java.net.InetSocketAddress; import java.net.ProxySelector; import java.net.URI; import java.net.URISyntaxException; @@ -34,6 +25,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.InjectableValues; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; /** *

@@ -133,10 +130,8 @@ private WebServiceClient(Builder builder) { (builder.accountId + ":" + builder.licenseKey).getBytes(StandardCharsets.UTF_8)); mapper = JsonMapper.builder() - .disable(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .addModule(new JavaTimeModule()) + .disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES) .build(); requestTimeout = builder.requestTimeout; @@ -405,7 +400,7 @@ private T handleResponse(HttpResponse response, Class cls) try { return mapper.readerFor(cls).with(inject).readValue(response.body()); - } catch (IOException e) { + } catch (JacksonException e) { throw new GeoIp2Exception( "Received a 200 response but could not decode it as JSON", e); } @@ -429,7 +424,7 @@ private void handle4xxStatus(HttpResponse response) handleErrorWithJsonBody(content, body, status, uri); } catch (HttpException e) { throw e; - } catch (IOException e) { + } catch (JacksonException e) { throw new HttpException("Received a " + status + " error for " + uri + " but it did not include the expected JSON body: " + body, status, uri); diff --git a/src/main/java/com/maxmind/geoip2/model/AnonymousIpResponse.java b/src/main/java/com/maxmind/geoip2/model/AnonymousIpResponse.java index c8a22226..59b5fc7e 100644 --- a/src/main/java/com/maxmind/geoip2/model/AnonymousIpResponse.java +++ b/src/main/java/com/maxmind/geoip2/model/AnonymousIpResponse.java @@ -1,9 +1,6 @@ package com.maxmind.geoip2.model; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; import com.maxmind.db.MaxMindDbParameter; @@ -11,6 +8,9 @@ import com.maxmind.geoip2.JsonSerializable; import com.maxmind.geoip2.NetworkDeserializer; import java.net.InetAddress; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * This class provides the GeoIP2 Anonymous IP model. diff --git a/src/main/java/com/maxmind/geoip2/model/AnonymousPlusResponse.java b/src/main/java/com/maxmind/geoip2/model/AnonymousPlusResponse.java index 22ac498b..76e134dc 100644 --- a/src/main/java/com/maxmind/geoip2/model/AnonymousPlusResponse.java +++ b/src/main/java/com/maxmind/geoip2/model/AnonymousPlusResponse.java @@ -1,9 +1,6 @@ package com.maxmind.geoip2.model; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbConstructor; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; @@ -13,6 +10,9 @@ import com.maxmind.geoip2.NetworkDeserializer; import java.net.InetAddress; import java.time.LocalDate; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * This class provides the GeoIP Anonymous Plus model. diff --git a/src/main/java/com/maxmind/geoip2/model/AsnResponse.java b/src/main/java/com/maxmind/geoip2/model/AsnResponse.java index 0dea5f03..e84a30db 100644 --- a/src/main/java/com/maxmind/geoip2/model/AsnResponse.java +++ b/src/main/java/com/maxmind/geoip2/model/AsnResponse.java @@ -1,9 +1,6 @@ package com.maxmind.geoip2.model; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; import com.maxmind.db.MaxMindDbParameter; @@ -11,6 +8,9 @@ import com.maxmind.geoip2.JsonSerializable; import com.maxmind.geoip2.NetworkDeserializer; import java.net.InetAddress; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * This class provides the GeoLite2 ASN model. diff --git a/src/main/java/com/maxmind/geoip2/model/ConnectionTypeResponse.java b/src/main/java/com/maxmind/geoip2/model/ConnectionTypeResponse.java index 40b492c9..1e2bbc42 100644 --- a/src/main/java/com/maxmind/geoip2/model/ConnectionTypeResponse.java +++ b/src/main/java/com/maxmind/geoip2/model/ConnectionTypeResponse.java @@ -3,9 +3,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonValue; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbCreator; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; @@ -14,6 +11,9 @@ import com.maxmind.geoip2.JsonSerializable; import com.maxmind.geoip2.NetworkDeserializer; import java.net.InetAddress; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * This class provides the GeoIP2 Connection-Type model. diff --git a/src/main/java/com/maxmind/geoip2/model/DomainResponse.java b/src/main/java/com/maxmind/geoip2/model/DomainResponse.java index 347f255c..1bcd392c 100644 --- a/src/main/java/com/maxmind/geoip2/model/DomainResponse.java +++ b/src/main/java/com/maxmind/geoip2/model/DomainResponse.java @@ -1,9 +1,6 @@ package com.maxmind.geoip2.model; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; import com.maxmind.db.MaxMindDbParameter; @@ -11,6 +8,9 @@ import com.maxmind.geoip2.JsonSerializable; import com.maxmind.geoip2.NetworkDeserializer; import java.net.InetAddress; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * This class provides the GeoIP2 Domain model. diff --git a/src/main/java/com/maxmind/geoip2/model/IpRiskResponse.java b/src/main/java/com/maxmind/geoip2/model/IpRiskResponse.java index b137e4e2..e0519ceb 100644 --- a/src/main/java/com/maxmind/geoip2/model/IpRiskResponse.java +++ b/src/main/java/com/maxmind/geoip2/model/IpRiskResponse.java @@ -1,9 +1,6 @@ package com.maxmind.geoip2.model; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; import com.maxmind.db.MaxMindDbParameter; @@ -11,6 +8,9 @@ import com.maxmind.geoip2.JsonSerializable; import com.maxmind.geoip2.NetworkDeserializer; import java.net.InetAddress; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * This class provides the GeoIP2 IP Risk model. diff --git a/src/main/java/com/maxmind/geoip2/model/IspResponse.java b/src/main/java/com/maxmind/geoip2/model/IspResponse.java index 612816b4..642d1b89 100644 --- a/src/main/java/com/maxmind/geoip2/model/IspResponse.java +++ b/src/main/java/com/maxmind/geoip2/model/IspResponse.java @@ -1,9 +1,6 @@ package com.maxmind.geoip2.model; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; import com.maxmind.db.MaxMindDbParameter; @@ -11,6 +8,9 @@ import com.maxmind.geoip2.JsonSerializable; import com.maxmind.geoip2.NetworkDeserializer; import java.net.InetAddress; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * This class provides the GeoIP2 ISP model. diff --git a/src/main/java/com/maxmind/geoip2/record/Traits.java b/src/main/java/com/maxmind/geoip2/record/Traits.java index 04a04aeb..65f0a19e 100644 --- a/src/main/java/com/maxmind/geoip2/record/Traits.java +++ b/src/main/java/com/maxmind/geoip2/record/Traits.java @@ -1,9 +1,6 @@ package com.maxmind.geoip2.record; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.maxmind.db.MaxMindDbIpAddress; import com.maxmind.db.MaxMindDbNetwork; import com.maxmind.db.MaxMindDbParameter; @@ -12,6 +9,9 @@ import com.maxmind.geoip2.NetworkDeserializer; import com.maxmind.geoip2.model.ConnectionTypeResponse.ConnectionType; import java.net.InetAddress; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * Contains data for the traits record associated with an IP address. diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index fea2e6f6..c2f97db4 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,8 +1,7 @@ @SuppressWarnings("module") // suppress terminal digit warning module com.maxmind.geoip2 { requires com.fasterxml.jackson.annotation; - requires com.fasterxml.jackson.databind; - requires com.fasterxml.jackson.datatype.jsr310; + requires tools.jackson.databind; requires transitive com.maxmind.db; requires java.net.http; diff --git a/src/test/java/com/maxmind/geoip2/NetworkDeserializerTest.java b/src/test/java/com/maxmind/geoip2/NetworkDeserializerTest.java index 35b2d57c..c05225fb 100644 --- a/src/test/java/com/maxmind/geoip2/NetworkDeserializerTest.java +++ b/src/test/java/com/maxmind/geoip2/NetworkDeserializerTest.java @@ -1,11 +1,11 @@ package com.maxmind.geoip2; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.core.json.JsonFactory; import com.maxmind.db.Network; import org.junit.jupiter.api.Test; -import java.io.IOException; import java.net.InetAddress; import static org.junit.jupiter.api.Assertions.*; @@ -13,7 +13,7 @@ final class NetworkDeserializerTest { - private static Network parse(String jsonString) throws IOException { + private static Network parse(String jsonString) { var deserializer = new NetworkDeserializer(); JsonFactory jf = new JsonFactory(); try (JsonParser p = jf.createParser(jsonString)) { @@ -41,20 +41,20 @@ void parsesValidIPv6Cidr() throws Exception { @Test void rejectsWhitespaceInCidr() { - assertThrows(IOException.class, () -> parse("\" 10.0.0.0/8 \"")); + assertThrows(JacksonException.class, () -> parse("\" 10.0.0.0/8 \"")); } @Test - void returnsNullOnJsonNull() throws Exception { + void returnsNullOnJsonNull() { Network actual = parse("null"); assertNull(actual); } @Test - void returnsNullOnBlankString() throws Exception { + void returnsNullOnBlankString() { Network actual = parse("\" \""); assertNull(actual); } @@ -83,7 +83,7 @@ void throwsOnOutOfRangePrefixIpv6() { @Test void wrapsUnknownHostInIOException() { - IOException ex = assertThrows(IOException.class, () -> parse("\"999.999.999.999/24\"")); + JacksonException ex = assertThrows(JacksonException.class, () -> parse("\"999.999.999.999/24\"")); assertNotNull(ex.getCause()); } } diff --git a/src/test/java/com/maxmind/geoip2/model/JsonTest.java b/src/test/java/com/maxmind/geoip2/model/JsonTest.java index 97e69a8b..4ec62a44 100644 --- a/src/test/java/com/maxmind/geoip2/model/JsonTest.java +++ b/src/test/java/com/maxmind/geoip2/model/JsonTest.java @@ -2,12 +2,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import com.fasterxml.jackson.databind.InjectableValues; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.jr.ob.JSON; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.InjectableValues; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.jr.ob.JSON; import java.io.IOException; import java.util.Collections; import org.junit.jupiter.api.Test; @@ -19,18 +18,18 @@ public void testInsightsSerialization() throws IOException { String json = JSON.std .composeString() .startObject() - .startObjectField("maxmind") + .startObjectProperty("maxmind") .put("queries_remaining", 11) .end() - .startObjectField("registered_country") + .startObjectProperty("registered_country") .put("geoname_id", 2) - .startObjectField("names") + .startObjectProperty("names") .put("en", "Canada") .end() .put("is_in_european_union", false) .put("iso_code", "CA") .end() - .startObjectField("traits") + .startObjectProperty("traits") .put("autonomous_system_organization", "AS Organization") .put("autonomous_system_number", 1234) .put("domain", "example.com") @@ -52,7 +51,7 @@ public void testInsightsSerialization() throws IOException { // difference .put("is_legitimate_proxy", false) .end() - .startObjectField("anonymizer") + .startObjectProperty("anonymizer") .put("confidence", 99) .put("is_anonymous", true) .put("is_anonymous_vpn", true) @@ -63,8 +62,8 @@ public void testInsightsSerialization() throws IOException { .put("network_last_seen", "2024-12-31") .put("provider_name", "NordVPN") .end() - .startObjectField("country") - .startObjectField("names") + .startObjectProperty("country") + .startObjectProperty("names") .put("en", "United States of America") .end() .put("geoname_id", 1) @@ -72,14 +71,14 @@ public void testInsightsSerialization() throws IOException { .put("iso_code", "US") .put("confidence", 99) .end() - .startObjectField("continent") - .startObjectField("names") + .startObjectProperty("continent") + .startObjectProperty("names") .put("en", "North America") .end() .put("code", "NA") .put("geoname_id", 42) .end() - .startObjectField("location") + .startObjectProperty("location") .put("average_income", 24626) .put("population_density", 1341) .put("time_zone", "America/Chicago") @@ -87,12 +86,12 @@ public void testInsightsSerialization() throws IOException { .put("latitude", 44.98) .put("longitude", 93.2636) .end() - .startArrayField("subdivisions") + .startArrayProperty("subdivisions") .startObject() .put("confidence", 88) .put("iso_code", "MN") .put("geoname_id", 574635) - .startObjectField("names") + .startObjectProperty("names") .put("en", "Minnesota") .end() .end() @@ -100,23 +99,23 @@ public void testInsightsSerialization() throws IOException { .put("iso_code", "TT") .end() .end() - .startObjectField("represented_country") + .startObjectProperty("represented_country") .put("geoname_id", 3) - .startObjectField("names") + .startObjectProperty("names") .put("en", "United Kingdom") .end() .put("type", "C") .put("is_in_european_union", true) .put("iso_code", "GB") .end() - .startObjectField("postal") + .startObjectProperty("postal") .put("code", "55401") .put("confidence", 33) .end() - .startObjectField("city") + .startObjectProperty("city") .put("confidence", 76) .put("geoname_id", 9876) - .startObjectField("names") + .startObjectProperty("names") .put("en", "Minneapolis") .end() .end() @@ -131,18 +130,18 @@ public void testCitySerialization() throws IOException { String json = JSON.std .composeString() .startObject() - .startObjectField("maxmind") + .startObjectProperty("maxmind") .put("queries_remaining", 11) .end() - .startObjectField("registered_country") + .startObjectProperty("registered_country") .put("geoname_id", 2) - .startObjectField("names") + .startObjectProperty("names") .put("en", "Canada") .end() .put("is_in_european_union", false) .put("iso_code", "CA") .end() - .startObjectField("traits") + .startObjectProperty("traits") .put("autonomous_system_number", 1234) .put("isp", "Comcast") .put("ip_address", "1.2.3.4") @@ -161,31 +160,31 @@ public void testCitySerialization() throws IOException { .put("is_tor_exit_node", false) .put("network", "1.2.3.0/24") .end() - .startObjectField("country") - .startObjectField("names") + .startObjectProperty("country") + .startObjectProperty("names") .put("en", "United States of America") .end() .put("geoname_id", 1) .put("is_in_european_union", false) .put("iso_code", "US") .end() - .startObjectField("continent") - .startObjectField("names") + .startObjectProperty("continent") + .startObjectProperty("names") .put("en", "North America") .end() .put("code", "NA") .put("geoname_id", 42) .end() - .startObjectField("location") + .startObjectProperty("location") .put("time_zone", "America/Chicago") .put("latitude", 44.98) .put("longitude", 93.2636) .end() - .startArrayField("subdivisions") + .startArrayProperty("subdivisions") .startObject() .put("iso_code", "MN") .put("geoname_id", 574635) - .startObjectField("names") + .startObjectProperty("names") .put("en", "Minnesota") .end() .end() @@ -193,21 +192,21 @@ public void testCitySerialization() throws IOException { .put("iso_code", "TT") .end() .end() - .startObjectField("represented_country") + .startObjectProperty("represented_country") .put("geoname_id", 3) - .startObjectField("names") + .startObjectProperty("names") .put("en", "United Kingdom") .end() .put("type", "C") .put("is_in_european_union", true) .put("iso_code", "GB") .end() - .startObjectField("postal") + .startObjectProperty("postal") .put("code", "55401") .end() - .startObjectField("city") + .startObjectProperty("city") .put("geoname_id", 9876) - .startObjectField("names") + .startObjectProperty("names") .put("en", "Minneapolis") .end() .end() @@ -222,18 +221,18 @@ public void testCountrySerialization() throws IOException { String json = JSON.std .composeString() .startObject() - .startObjectField("maxmind") + .startObjectProperty("maxmind") .put("queries_remaining", 11) .end() - .startObjectField("registered_country") + .startObjectProperty("registered_country") .put("geoname_id", 2) - .startObjectField("names") + .startObjectProperty("names") .put("en", "Canada") .end() .put("is_in_european_union", false) .put("iso_code", "CA") .end() - .startObjectField("traits") + .startObjectProperty("traits") .put("ip_address", "1.2.3.4") // These are here just to simplify the testing. We expect the // difference @@ -247,24 +246,24 @@ public void testCountrySerialization() throws IOException { .put("is_tor_exit_node", false) .put("network", "1.2.3.0/24") .end() - .startObjectField("country") - .startObjectField("names") + .startObjectProperty("country") + .startObjectProperty("names") .put("en", "United States of America") .end() .put("geoname_id", 1) .put("is_in_european_union", false) .put("iso_code", "US") .end() - .startObjectField("continent") - .startObjectField("names") + .startObjectProperty("continent") + .startObjectProperty("names") .put("en", "North America") .end() .put("code", "NA") .put("geoname_id", 42) .end() - .startObjectField("represented_country") + .startObjectProperty("represented_country") .put("geoname_id", 3) - .startObjectField("names") + .startObjectProperty("names") .put("en", "United Kingdom") .end() .put("type", "C") @@ -346,9 +345,7 @@ public void testIspSerialization() throws Exception { (Class cls, String json) throws IOException { JsonMapper mapper = JsonMapper.builder() - .disable(MapperFeature.CAN_OVERRIDE_ACCESS_MODIFIERS) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .addModule(new com.fasterxml.jackson.datatype.jsr310.JavaTimeModule()) + .disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES) .addModule(new com.maxmind.geoip2.InetAddressModule()) .build(); InjectableValues inject = new InjectableValues.Std().addValue(