diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 0e06809..274c1f5 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -13,14 +13,17 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: + distribution: temurin java-version: 17 - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle run: ./gradlew build - name: Codecov - uses: codecov/codecov-action@v1.0.6 + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d37697d..95d8933 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,10 +16,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: + distribution: temurin java-version: 17 - name: Grant execute permission for gradlew run: chmod +x gradlew diff --git a/README.md b/README.md index e3d0742..64b0399 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,14 @@ Dadata API client based on non-blocking HTTP client of Spring WebClient. Support ## [Release notes](ReleaseNotes.md) +## Compatibility + +| dadata-client | Spring Boot | +|---------------|-------------| +| 5.x | 4.x | +| 4.x | 3.x | +| 2.x / 3.x | 2.x | + ## Add a dependency Gradle: diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 691f10a..3151933 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,3 +1,8 @@ +# 5.0.0 + +- Обновлены зависимости до версии spring boot 4.1.0 +- Осуществлён переход с Jackson 2 на Jackson 3 + # 4.0.0 - Обновлены зависимости до версии spring boot 3.0.4 diff --git a/build.gradle b/build.gradle index 0b7d31b..a8e8a51 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { apply from: 'gradle/publish.gradle' group = 'com.github.kuliginstepan' -version = '4.0.0' +version = '5.0.0' sourceCompatibility = JavaVersion.VERSION_17 def nexusUsername = System.getenv("NEXUS_USERNAME") ?: (project.findProperty("NEXUS_USERNAME") ?: "") @@ -60,13 +60,13 @@ configurations { } dependencies { - internal platform('org.springframework.boot:spring-boot-dependencies:3.0.4') + internal platform('org.springframework.boot:spring-boot-dependencies:4.1.0') implementation 'org.springframework.boot:spring-boot' implementation 'org.springframework.boot:spring-boot-autoconfigure' implementation 'org.springframework:spring-webflux' implementation 'io.projectreactor.netty:reactor-netty' - implementation 'com.fasterxml.jackson.core:jackson-databind' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' + implementation 'tools.jackson.core:jackson-databind' + implementation 'com.fasterxml.jackson.core:jackson-annotations' implementation 'org.slf4j:slf4j-api' implementation 'jakarta.validation:jakarta.validation-api' implementation 'org.hibernate.validator:hibernate-validator' @@ -77,6 +77,8 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-jackson' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } test { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1bef7e..b413873 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/lombok.config b/lombok.config new file mode 100644 index 0000000..6c9a08a --- /dev/null +++ b/lombok.config @@ -0,0 +1,2 @@ +config.stopBubbling = true +lombok.jacksonized.jacksonVersion += 3 diff --git a/src/main/java/com/kuliginstepan/dadata/client/DadataClientAutoConfiguration.java b/src/main/java/com/kuliginstepan/dadata/client/DadataClientAutoConfiguration.java index 0f1b511..13f1f45 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/DadataClientAutoConfiguration.java +++ b/src/main/java/com/kuliginstepan/dadata/client/DadataClientAutoConfiguration.java @@ -1,11 +1,11 @@ package com.kuliginstepan.dadata.client; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -@Configuration +@AutoConfiguration @EnableConfigurationProperties(DadataClientProperties.class) public class DadataClientAutoConfiguration { diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnit.java b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnit.java index 554cc29..e495d38 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnit.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnit.java @@ -1,7 +1,7 @@ package com.kuliginstepan.dadata.client.domain.fms; import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonDeserialize; import com.kuliginstepan.dadata.client.domain.AdditionalProps; import lombok.EqualsAndHashCode; import lombok.Value; diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnitFilter.java b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnitFilter.java index 32f50cb..ee126a0 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnitFilter.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/FmsUnitFilter.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeDeserializer.java b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeDeserializer.java index c72f7e1..c767bff 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeDeserializer.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeDeserializer.java @@ -1,14 +1,13 @@ package com.kuliginstepan.dadata.client.domain.fms; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import java.io.IOException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.ValueDeserializer; -public class UnitTypeDeserializer extends JsonDeserializer { +public class UnitTypeDeserializer extends ValueDeserializer { @Override - public UnitType deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return UnitType.values()[Integer.parseInt(p.getText())]; + public UnitType deserialize(JsonParser p, DeserializationContext ctxt) { + return UnitType.values()[Integer.parseInt(p.getString())]; } } diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializer.java b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializer.java index 8651403..c0289f1 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializer.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializer.java @@ -1,14 +1,13 @@ package com.kuliginstepan.dadata.client.domain.fms; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; -public class UnitTypeSerializer extends JsonSerializer { +public class UnitTypeSerializer extends ValueSerializer { @Override - public void serialize(UnitType value, JsonGenerator gen, SerializerProvider provider) throws IOException { + public void serialize(UnitType value, JsonGenerator gen, SerializationContext ctxt) { gen.writeString(String.valueOf(value.ordinal())); } } diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Documents.java b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Documents.java index ceae1ab..3fc3922 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Documents.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Documents.java @@ -1,7 +1,7 @@ package com.kuliginstepan.dadata.client.domain.organization; import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonDeserialize; import com.kuliginstepan.dadata.client.json.LocalDateDeserializer; import java.time.LocalDate; import lombok.Builder; diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/License.java b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/License.java index 0b1e319..c925d00 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/License.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/License.java @@ -1,7 +1,7 @@ package com.kuliginstepan.dadata.client.domain.organization; import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonDeserialize; import com.kuliginstepan.dadata.client.json.LocalDateDeserializer; import java.time.LocalDate; import java.util.List; diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Organization.java b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Organization.java index 908823f..8648587 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Organization.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/Organization.java @@ -1,7 +1,7 @@ package com.kuliginstepan.dadata.client.domain.organization; import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonDeserialize; import com.kuliginstepan.dadata.client.domain.AdditionalProps; import com.kuliginstepan.dadata.client.domain.Suggestion; import com.kuliginstepan.dadata.client.domain.address.Address; diff --git a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/State.java b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/State.java index 31ce068..2f42d8b 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/domain/organization/State.java +++ b/src/main/java/com/kuliginstepan/dadata/client/domain/organization/State.java @@ -1,7 +1,7 @@ package com.kuliginstepan.dadata.client.domain.organization; import com.fasterxml.jackson.annotation.JsonAlias; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonDeserialize; import com.kuliginstepan.dadata.client.domain.OrganizationStatus; import com.kuliginstepan.dadata.client.json.LocalDateDeserializer; import java.time.LocalDate; diff --git a/src/main/java/com/kuliginstepan/dadata/client/json/LocalDateDeserializer.java b/src/main/java/com/kuliginstepan/dadata/client/json/LocalDateDeserializer.java index f698fad..9f42ae7 100644 --- a/src/main/java/com/kuliginstepan/dadata/client/json/LocalDateDeserializer.java +++ b/src/main/java/com/kuliginstepan/dadata/client/json/LocalDateDeserializer.java @@ -1,18 +1,16 @@ package com.kuliginstepan.dadata.client.json; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import java.io.IOException; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.ValueDeserializer; -public class LocalDateDeserializer extends JsonDeserializer { +public class LocalDateDeserializer extends ValueDeserializer { @Override - public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) - throws IOException { + public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) { long epochMillis = p.getLongValue(); return Instant.ofEpochMilli(epochMillis).atZone(ZoneId.of("UTC")).toLocalDate(); } diff --git a/src/test/java/com/kuliginstepan/dadata/client/BankSuggestionTest.java b/src/test/java/com/kuliginstepan/dadata/client/BankSuggestionTest.java index 950fad2..bb9bfa5 100644 --- a/src/test/java/com/kuliginstepan/dadata/client/BankSuggestionTest.java +++ b/src/test/java/com/kuliginstepan/dadata/client/BankSuggestionTest.java @@ -45,11 +45,11 @@ public void findBankByBicTest() { @Test public void rangingSuggestBankTest() { List> suggestions = TestUtils.CLIENT - .suggestBank(BankRequestBuilder.create("сбербанк").locationBoost("4402400100000").build()).collectList() + .suggestBank(BankRequestBuilder.create("сбербанк").locationBoost("3800000100000").build()).collectList() .block(); assertNotNull(suggestions); assertFalse(suggestions.isEmpty()); - assertTrue(suggestions.get(0).getData().getAddress().getData().getRegionKladrId().startsWith("44")); + assertTrue(suggestions.get(0).getData().getAddress().getData().getRegionKladrId().startsWith("38")); } @Test diff --git a/src/test/java/com/kuliginstepan/dadata/client/DeliverySuggestionTest.java b/src/test/java/com/kuliginstepan/dadata/client/DeliverySuggestionTest.java index 96e283f..9c78475 100644 --- a/src/test/java/com/kuliginstepan/dadata/client/DeliverySuggestionTest.java +++ b/src/test/java/com/kuliginstepan/dadata/client/DeliverySuggestionTest.java @@ -18,7 +18,7 @@ public void findDeliveryByIdTest() { assertNotNull(suggestion); Delivery delivery = suggestion.getData(); - assertEquals("01929", delivery.getBoxberryId()); + assertEquals("7720193", delivery.getBoxberryId()); assertEquals("344", delivery.getCdekId()); assertEquals("196006461", delivery.getDpdId()); } diff --git a/src/test/java/com/kuliginstepan/dadata/client/FnsUnitSuggestionTest.java b/src/test/java/com/kuliginstepan/dadata/client/FnsUnitSuggestionTest.java index cd3a25c..f9b5ae6 100644 --- a/src/test/java/com/kuliginstepan/dadata/client/FnsUnitSuggestionTest.java +++ b/src/test/java/com/kuliginstepan/dadata/client/FnsUnitSuggestionTest.java @@ -35,25 +35,25 @@ public void suggestFnsUnitWithFilterTest() { List> suggestions = TestUtils.CLIENT.suggestFnsUnit( FnsUnitRequest.builder() .query("ленинск") - .regionCode("58") + .regionCode("66") .build()) .collectList().block(); assertNotNull(suggestions); assertFalse(suggestions.isEmpty()); - suggestions.forEach(suggestion -> assertTrue(suggestion.getData().getCode().startsWith("58"))); + suggestions.forEach(suggestion -> assertTrue(suggestion.getData().getCode().startsWith("66"))); } @Test public void findFnsUnitByIdTest() { - Suggestion suggestion = TestUtils.CLIENT.findFnsUnitById("5836").block(); + Suggestion suggestion = TestUtils.CLIENT.findFnsUnitById("6671").block(); assertNotNull(suggestion); FnsUnit fnsUnit = suggestion.getData(); - assertEquals("5836", fnsUnit.getCode()); - assertEquals("5836010018", fnsUnit.getInn()); + assertEquals("6671", fnsUnit.getCode()); + assertEquals("7727406020", fnsUnit.getInn()); } diff --git a/src/test/java/com/kuliginstepan/dadata/client/IplocateRequestTest.java b/src/test/java/com/kuliginstepan/dadata/client/IplocateRequestTest.java index f23f14f..26577b0 100644 --- a/src/test/java/com/kuliginstepan/dadata/client/IplocateRequestTest.java +++ b/src/test/java/com/kuliginstepan/dadata/client/IplocateRequestTest.java @@ -15,7 +15,7 @@ public void iplocateTest() { assertThat(suggestion) .isNotNull() - .hasFieldOrPropertyWithValue("value", "г Краснодар"); + .hasFieldOrPropertyWithValue("value", "г Москва"); } @Test public void iplocateNullTest() { diff --git a/src/test/java/com/kuliginstepan/dadata/client/OrganizationSuggestionTest.java b/src/test/java/com/kuliginstepan/dadata/client/OrganizationSuggestionTest.java index 883be5c..8ac9c52 100644 --- a/src/test/java/com/kuliginstepan/dadata/client/OrganizationSuggestionTest.java +++ b/src/test/java/com/kuliginstepan/dadata/client/OrganizationSuggestionTest.java @@ -50,7 +50,7 @@ public void suggestOrganizationByFioTest() { .collectList().block(); assertThat(suggestions) - .hasSize(7) + .hasSize(8) .extracting(Suggestion::getValue) .contains("ИП Коварский Станислав Альбертович", "ООО \"ВЕГА\""); } @@ -66,7 +66,7 @@ public void suggestOrganizationWithLocationTest() { assertNotNull(suggestions); assertFalse(suggestions.isEmpty()); - assertEquals(4, suggestions.size()); + assertEquals(5, suggestions.size()); assertEquals(1, regionKladrIds.size()); assertTrue(regionKladrIds.get(0).startsWith("77")); } diff --git a/src/test/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializerTest.java b/src/test/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializerTest.java index 51e3181..4c992d1 100644 --- a/src/test/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializerTest.java +++ b/src/test/java/com/kuliginstepan/dadata/client/domain/fms/UnitTypeSerializerTest.java @@ -1,12 +1,7 @@ package com.kuliginstepan.dadata.client.domain.fms; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; import java.io.StringWriter; import java.util.Map; import org.junit.jupiter.api.Test; @@ -15,6 +10,9 @@ import org.springframework.boot.test.autoconfigure.json.JsonTest; import org.springframework.boot.test.json.JacksonTester; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.core.JsonGenerator; +import tools.jackson.core.ObjectWriteContext; +import tools.jackson.core.json.JsonFactory; @JsonTest @ExtendWith(SpringExtension.class) @@ -24,23 +22,22 @@ public class UnitTypeSerializerTest { private JacksonTester> json; @Test - public void shouldDeserializeFromOrdinal() throws IOException { + public void shouldDeserializeFromOrdinal() throws Exception { json.parse("{\"type\": 0}").assertThat().asMap().containsValue(UnitType.FMS); } @Test - public void shouldSerializeToOrdinal() throws IOException { + public void shouldSerializeToOrdinal() throws Exception { UnitType unitType = UnitType.FMS; StringWriter out = new StringWriter(); - JsonFactory jsonFactory = new JsonFactory(); - JsonGenerator jsonGenerator = jsonFactory.createGenerator(out); + JsonGenerator jsonGenerator = new JsonFactory().createGenerator(ObjectWriteContext.empty(), out); UnitTypeSerializer serializer = new UnitTypeSerializer(); - serializer.serialize(unitType, jsonGenerator, any(SerializerProvider.class)); + serializer.serialize(unitType, jsonGenerator, null); jsonGenerator.flush(); assertEquals("\"" + unitType.ordinal() + "\"", out.toString()); } -} \ No newline at end of file +}