Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion eng/versioning/external_dependencies.txt
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,6 @@ storage_com.microsoft.azure:azure-storage;8.6.6
# sdk\spring\pom.xml modules
springboot4_com.diffplug.spotless:spotless-maven-plugin;2.30.0
springboot4_com.fasterxml.jackson.core:jackson-annotations;2.21
springboot4_com.fasterxml.jackson.core:jackson-databind;2.21.4
springboot4_com.fasterxml.jackson.datatype:jackson-datatype-jdk8;2.21.4
springboot4_com.fasterxml.jackson.module:jackson-module-parameter-names;2.21.4
springboot4_com.github.spotbugs:spotbugs-maven-plugin;4.8.2.0
Expand Down Expand Up @@ -346,6 +345,7 @@ springboot4_org.springframework.boot:spring-boot-data-redis;4.1.0
springboot4_org.springframework.boot:spring-boot-docker-compose;4.1.0
springboot4_org.springframework.boot:spring-boot-health;4.1.0
springboot4_org.springframework.boot:spring-boot-http-converter;4.1.0
springboot4_org.springframework.boot:spring-boot-jackson;4.1.0
springboot4_org.springframework.boot:spring-boot-jackson2;4.1.0
springboot4_org.springframework.boot:spring-boot-jdbc;4.1.0
springboot4_org.springframework.boot:spring-boot-jms;4.1.0
Expand Down Expand Up @@ -387,6 +387,7 @@ springboot4_org.springframework:spring-web;7.0.8
springboot4_org.springframework:spring-webmvc;7.0.8
springboot4_org.testcontainers:testcontainers-junit-jupiter;2.0.5
springboot4_org.testcontainers:testcontainers-azure;2.0.5
springboot4_tools.jackson.core:jackson-databind;3.1.4
springboot4_jakarta.annotation:jakarta.annotation-api;3.0.0
springboot4_ch.qos.logback:logback-classic;1.5.34
springboot4_org.awaitility:awaitility;4.3.0
Expand Down
74 changes: 74 additions & 0 deletions sdk/spring/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,80 @@ This section includes changes in `spring-cloud-azure-autoconfigure` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Messaging Azure

This section includes changes in `spring-messaging-azure` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Messaging Azure Event Hubs

This section includes changes in `spring-messaging-azure-eventhubs` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Messaging Azure Service Bus

This section includes changes in `spring-messaging-azure-servicebus` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Messaging Azure Storage Queue

This section includes changes in `spring-messaging-azure-storage-queue` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Cloud Azure App Configuration Config

This section includes changes in `spring-cloud-azure-appconfiguration-config` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Cloud Azure App Configuration Config Web

This section includes changes in `spring-cloud-azure-appconfiguration-config-web` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Cloud Azure Feature Management

This section includes changes in `spring-cloud-azure-feature-management` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Cloud Azure Actuator Autoconfigure

This section includes changes in `spring-cloud-azure-actuator-autoconfigure` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

### Spring Cloud Azure Docker Compose

This section includes changes in `spring-cloud-azure-docker-compose` module.

#### Other Changes

- Upgrade to Jackson 3 to align with Spring Boot 4 ([#49538](https://github.com/Azure/azure-sdk-for-java/issues/49538)).

## 6.4.0 (2026-06-01)
- This release is compatible with Spring Boot 3.5.0-3.5.14. (Note: 3.5.x (x>14) should be supported, but they aren't tested with this release.)
- This release is compatible with Spring Cloud 2025.0.0-2025.0.2. (Note: 2025.0.x (x>2) should be supported, but they aren't tested with this release.)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.21.4</version> <!-- {x-version-update;springboot4_com.fasterxml.jackson.core:jackson-databind;external_dependency} -->
<version>3.1.4</version> <!-- {x-version-update;springboot4_tools.jackson.core:jackson-databind;external_dependency} -->
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
Expand Down Expand Up @@ -198,7 +198,7 @@
<rules>
<bannedDependencies>
<includes>
<include>com.fasterxml.jackson.core:jackson-databind:[2.21.4]</include> <!-- {x-include-update;springboot4_com.fasterxml.jackson.core:jackson-databind;external_dependency} -->
<include>tools.jackson.core:jackson-databind:[3.1.4]</include> <!-- {x-include-update;springboot4_tools.jackson.core:jackson-databind;external_dependency} -->
<include>org.springframework.boot:spring-boot-actuator:[4.1.0]</include> <!-- {x-include-update;springboot4_org.springframework.boot:spring-boot-actuator;external_dependency} -->
<include>org.springframework.boot:spring-boot-actuator-autoconfigure:[4.1.0]</include> <!-- {x-include-update;springboot4_org.springframework.boot:spring-boot-actuator-autoconfigure;external_dependency} -->
</includes>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationStoreMonitoring.AccessToken;
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationStoreMonitoring.PushNotification;
import com.azure.spring.cloud.appconfiguration.config.implementation.properties.ConfigStore;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import jakarta.servlet.http.HttpServletRequest;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;

/**
* Common class for authenticating refresh requests.
Expand All @@ -37,7 +38,7 @@ public class AppConfigurationEndpoint {

private final JsonNode validationResponse;

private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final ObjectMapper OBJECT_MAPPER = JsonMapper.builder().build();

/**
* Base Authentication for refresh endpoints.
Expand All @@ -63,7 +64,7 @@ public AppConfigurationEndpoint(HttpServletRequest request, List<ConfigStore> co
if (data != null) {
JsonNode syncTokenNode = data.findValue(SYNC_TOKEN);
if (syncTokenNode != null) {
sToken = syncTokenNode.asText();
sToken = syncTokenNode.asString();
}
}

Expand All @@ -73,7 +74,7 @@ public AppConfigurationEndpoint(HttpServletRequest request, List<ConfigStore> co

JsonNode requestSubject = requestBody.findValue(CONFIG_STORE_SUBJECT);
if (requestSubject != null) {
String subject = requestSubject.asText();
String subject = requestSubject.asString();
endpoint = URI.create(subject);
} else {
throw new IllegalArgumentException("Refresh request missing topic field.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@

import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProperties;
import com.azure.spring.cloud.appconfiguration.config.web.implementation.AppConfigurationEndpoint;
import com.fasterxml.jackson.databind.JsonNode;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import tools.jackson.databind.JsonNode;

/**
* Endpoint for requesting new configurations to be loaded in all registered instances on the Bus.
Expand Down Expand Up @@ -82,7 +82,7 @@ public String refresh(HttpServletRequest request, HttpServletResponse response,
JsonNode validationResponse = endpoint.getValidationResponse();
if (validationResponse != null) {
// Validating Web Hook
return VALIDATION_CODE_FORMAT_START + validationResponse.asText() + "\"}";
return VALIDATION_CODE_FORMAT_START + validationResponse.asString() + "\"}";
} else {
if (!endpoint.authenticate()) {
return HttpStatus.UNAUTHORIZED.getReasonPhrase();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@

import com.azure.spring.cloud.appconfiguration.config.implementation.properties.AppConfigurationProperties;
import com.azure.spring.cloud.appconfiguration.config.web.implementation.AppConfigurationEndpoint;
import com.fasterxml.jackson.databind.JsonNode;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import tools.jackson.databind.JsonNode;

/**
* Endpoint for requesting new configurations to be loaded.
Expand Down Expand Up @@ -84,7 +84,7 @@ public String refresh(HttpServletRequest request, HttpServletResponse response,
JsonNode validationResponse = endpoint.getValidationResponse();
if (validationResponse != null) {
// Validating Web Hook
return String.format("%s%s\"}", VALIDATION_CODE_FORMAT_START, validationResponse.asText());
return String.format("%s%s\"}", VALIDATION_CODE_FORMAT_START, validationResponse.asString());
} else {
if (!endpoint.authenticate()) {
return HttpStatus.UNAUTHORIZED.getReasonPhrase();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,11 @@
import org.mockito.MockitoAnnotations;

import com.azure.spring.cloud.appconfiguration.config.implementation.properties.ConfigStore;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import jakarta.servlet.http.HttpServletRequest;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;

public class AppConfigurationEndpointTest {

Expand All @@ -49,7 +47,7 @@ public class AppConfigurationEndpointTest {

private static final String GET_TEST_INVALID = "src/test/resources/webHookInvalid.json";

private ObjectMapper mapper = new ObjectMapper();
private ObjectMapper mapper = JsonMapper.builder().build();

@BeforeEach
public void setup() throws IOException {
Expand All @@ -59,7 +57,7 @@ public void setup() throws IOException {
}

@Test
public void validationParsing() throws JsonGenerationException, JsonMappingException, IOException {
public void validationParsing() throws IOException {
String requestBody = mapper.readValue(new File(GET_TEST_VALIDATION), JsonNode.class).toString();
when(lines.collect(Mockito.any())).thenReturn(requestBody);

Expand All @@ -77,7 +75,7 @@ public void validationParsing() throws JsonGenerationException, JsonMappingExcep
}

@Test
public void validationInvalidParsing() throws JsonGenerationException, JsonMappingException, IOException {
public void validationInvalidParsing() throws IOException {
String requestBody = mapper.readValue(new File(GET_TEST_INVALID), JsonNode.class).toString();
when(lines.collect(Mockito.any())).thenReturn(requestBody);
List<ConfigStore> configStores = new ArrayList<ConfigStore>();
Expand All @@ -88,7 +86,7 @@ public void validationInvalidParsing() throws JsonGenerationException, JsonMappi
}

@Test
public void authenticate() throws JsonParseException, JsonMappingException, IOException {
public void authenticate() throws IOException {
String requestBody = mapper.readValue(new File(GET_TEST_VALIDATION), JsonNode.class).toString();
when(lines.collect(Mockito.any())).thenReturn(requestBody);

Expand Down Expand Up @@ -158,7 +156,7 @@ public void authenticate() throws JsonParseException, JsonMappingException, IOEx
}

@Test
public void triggerRefresh() throws JsonParseException, JsonMappingException, IOException {
public void triggerRefresh() throws IOException {
String requestBody = mapper.readValue(new File(GET_TEST_VALIDATION), JsonNode.class).toString();
when(lines.collect(Mockito.any())).thenReturn(requestBody);
List<ConfigStore> configStores = new ArrayList<ConfigStore>();
Expand Down
12 changes: 11 additions & 1 deletion sdk/spring/spring-cloud-azure-appconfiguration-config/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,16 @@
<artifactId>spring-cloud-azure-autoconfigure</artifactId>
<version>7.4.0-beta.1</version> <!-- {x-version-update;com.azure.spring:spring-cloud-azure-autoconfigure;current} -->
</dependency>
<dependency>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>3.1.4</version> <!-- {x-version-update;springboot4_tools.jackson.core:jackson-databind;external_dependency} -->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.21</version> <!-- {x-version-update;springboot4_com.fasterxml.jackson.core:jackson-annotations;external_dependency} -->
</dependency>
<!-- Test Dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down Expand Up @@ -177,7 +187,7 @@
<bannedDependencies>
<includes>
<include>com.fasterxml.jackson.core:jackson-annotations:[2.21]</include> <!-- {x-include-update;springboot4_com.fasterxml.jackson.core:jackson-annotations;external_dependency} -->
<include>com.fasterxml.jackson.core:jackson-databind:[2.21.4]</include> <!-- {x-include-update;springboot4_com.fasterxml.jackson.core:jackson-databind;external_dependency} -->
<include>tools.jackson.core:jackson-databind:[3.1.4]</include> <!-- {x-include-update;springboot4_tools.jackson.core:jackson-databind;external_dependency} -->
<include>org.springframework.boot:spring-boot-actuator:[4.1.0]</include> <!-- {x-include-update;springboot4_org.springframework.boot:spring-boot-actuator;external_dependency} -->
<include>org.springframework.boot:spring-boot-autoconfigure:[4.1.0]</include> <!-- {x-include-update;springboot4_org.springframework.boot:spring-boot-autoconfigure;external_dependency} -->
<include>org.springframework.cloud:spring-cloud-context:[5.0.2]</include> <!-- {x-include-update;springboot4_org.springframework.cloud:spring-cloud-context;external_dependency} -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

import org.springframework.core.env.EnumerablePropertySource;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;

/**
* Azure App Configuration PropertySource unique per Store Label(Profile) combo.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@
import com.azure.spring.cloud.appconfiguration.config.implementation.feature.entity.FeatureTelemetry;
import com.azure.spring.cloud.appconfiguration.config.implementation.feature.entity.Variant;
import com.azure.spring.cloud.appconfiguration.config.implementation.http.policy.FeatureFlagTracing;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import tools.jackson.core.JacksonException;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.MapperFeature;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;

/**
* Loads sets of feature flags, and de-duplicates the results with previously loaded feature flags. Newer Feature Flags
Expand Down Expand Up @@ -138,7 +138,7 @@ protected static Feature createFeature(FeatureFlagConfigurationSetting item, Str
JsonNode node = CASE_INSENSITIVE_MAPPER.readTree(item.getValue());
JsonNode conditions = node.get(CONDITIONS);
if (conditions != null && conditions.get(REQUIREMENT_TYPE_SERVICE) != null) {
requirementType = conditions.get(REQUIREMENT_TYPE_SERVICE).asText();
requirementType = conditions.get(REQUIREMENT_TYPE_SERVICE).asString();
}
JsonNode telemetryNode = node.get(TELEMETRY);
if (telemetryNode != null && !telemetryNode.isEmpty()) {
Expand Down Expand Up @@ -179,7 +179,7 @@ protected static Feature createFeature(FeatureFlagConfigurationSetting item, Str
originMetadata.put("AllocationId", generateAllocationId(node));
}
}
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
LOGGER.error("Error parsing feature flag value for key: {}", item.getKey(), e);
}
return feature;
Expand Down Expand Up @@ -231,7 +231,7 @@ private void updateTelemetry(FeatureFlagConfigurationSetting featureFlag) {
if (variantsNode != null && variantsNode.isArray()) {
tracing.updateMaxVariants(variantsNode.size());
}
} catch (JsonProcessingException e) {
} catch (JacksonException e) {
LOGGER.warn("Error parsing feature flag telemetry for key: {}", featureFlag.getKey(), e);
}
}
Expand All @@ -253,21 +253,21 @@ static String generateAllocationId(JsonNode featureFlagValue) {
}

// Seed
allocationId.append("seed=").append(allocation.has("seed") ? allocation.get("seed").asText() : "");
allocationId.append("seed=").append(allocation.has("seed") ? allocation.get("seed").asString() : "");

// DefaultWhenEnabled
if (allocation.has("default_when_enabled")) {
allocatedVariants.add(allocation.get("default_when_enabled").asText());
allocatedVariants.add(allocation.get("default_when_enabled").asString());
}
allocationId.append("\ndefault_when_enabled=").append(allocation.has("default_when_enabled") ? allocation.get("default_when_enabled").asText() : "");
allocationId.append("\ndefault_when_enabled=").append(allocation.has("default_when_enabled") ? allocation.get("default_when_enabled").asString() : "");

// Percentile
allocationId.append("\npercentiles=");
JsonNode percentile = allocation.get("percentile");
List<JsonNode> percentileAllocations = new ArrayList<>();
if (percentile != null && percentile.isArray()) {
percentile.forEach(p -> {
if (!Objects.equals(p.get("from").asText(), p.get("to").asText())) {
if (!Objects.equals(p.get("from").asString(), p.get("to").asString())) {
percentileAllocations.add(p);
}
});
Expand All @@ -276,13 +276,13 @@ static String generateAllocationId(JsonNode featureFlagValue) {

for (JsonNode percentileAllocation : percentileAllocations) {
if (percentileAllocation.has("variant")) {
allocatedVariants.add(percentileAllocation.get("variant").asText());
allocatedVariants.add(percentileAllocation.get("variant").asString());
}
}

allocationId.append(percentileAllocations.stream()
.map(pa -> pa.get("from") + ","
+ Base64.getEncoder().encodeToString(pa.get("variant").asText().getBytes(StandardCharsets.UTF_8)) + ","
+ Base64.getEncoder().encodeToString(pa.get("variant").asString().getBytes(StandardCharsets.UTF_8)) + ","
+ pa.get("to"))
.collect(Collectors.joining(";")));

Expand Down
Loading
Loading