|
Add this skill
npx mdskills install sickn33/azure-appconfiguration-javaComprehensive SDK reference with detailed examples for all Azure App Configuration features
1---2name: azure-appconfiguration-java3description: |4 Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.5 Triggers: "ConfigurationClient java", "app configuration java", "feature flag java", "configuration setting java", "azure config java".6package: com.azure:azure-data-appconfiguration7---89# Azure App Configuration SDK for Java1011Client library for Azure App Configuration, a managed service for centralizing application configurations.1213## Installation1415```xml16<dependency>17 <groupId>com.azure</groupId>18 <artifactId>azure-data-appconfiguration</artifactId>19 <version>1.8.0</version>20</dependency>21```2223Or use Azure SDK BOM:2425```xml26<dependencyManagement>27 <dependencies>28 <dependency>29 <groupId>com.azure</groupId>30 <artifactId>azure-sdk-bom</artifactId>31 <version>{bom_version}</version>32 <type>pom</type>33 <scope>import</scope>34 </dependency>35 </dependencies>36</dependencyManagement>3738<dependencies>39 <dependency>40 <groupId>com.azure</groupId>41 <artifactId>azure-data-appconfiguration</artifactId>42 </dependency>43</dependencies>44```4546## Prerequisites4748- Azure App Configuration store49- Connection string or Entra ID credentials5051## Environment Variables5253```bash54AZURE_APPCONFIG_CONNECTION_STRING=Endpoint=https://<store>.azconfig.io;Id=<id>;Secret=<secret>55AZURE_APPCONFIG_ENDPOINT=https://<store>.azconfig.io56```5758## Client Creation5960### With Connection String6162```java63import com.azure.data.appconfiguration.ConfigurationClient;64import com.azure.data.appconfiguration.ConfigurationClientBuilder;6566ConfigurationClient configClient = new ConfigurationClientBuilder()67 .connectionString(System.getenv("AZURE_APPCONFIG_CONNECTION_STRING"))68 .buildClient();69```7071### Async Client7273```java74import com.azure.data.appconfiguration.ConfigurationAsyncClient;7576ConfigurationAsyncClient asyncClient = new ConfigurationClientBuilder()77 .connectionString(connectionString)78 .buildAsyncClient();79```8081### With Entra ID (Recommended)8283```java84import com.azure.identity.DefaultAzureCredentialBuilder;8586ConfigurationClient configClient = new ConfigurationClientBuilder()87 .credential(new DefaultAzureCredentialBuilder().build())88 .endpoint(System.getenv("AZURE_APPCONFIG_ENDPOINT"))89 .buildClient();90```9192## Key Concepts9394| Concept | Description |95|---------|-------------|96| Configuration Setting | Key-value pair with optional label |97| Label | Dimension for separating settings (e.g., environments) |98| Feature Flag | Special setting for feature management |99| Secret Reference | Setting pointing to Key Vault secret |100| Snapshot | Point-in-time immutable view of settings |101102## Configuration Setting Operations103104### Create Setting (Add)105106Creates only if setting doesn't exist:107108```java109import com.azure.data.appconfiguration.models.ConfigurationSetting;110111ConfigurationSetting setting = configClient.addConfigurationSetting(112 "app/database/connection",113 "Production",114 "Server=prod.db.com;Database=myapp"115);116```117118### Create or Update Setting (Set)119120Creates or overwrites:121122```java123ConfigurationSetting setting = configClient.setConfigurationSetting(124 "app/cache/enabled",125 "Production",126 "true"127);128```129130### Get Setting131132```java133ConfigurationSetting setting = configClient.getConfigurationSetting(134 "app/database/connection",135 "Production"136);137System.out.println("Value: " + setting.getValue());138System.out.println("Content-Type: " + setting.getContentType());139System.out.println("Last Modified: " + setting.getLastModified());140```141142### Conditional Get (If Changed)143144```java145import com.azure.core.http.rest.Response;146import com.azure.core.util.Context;147148Response<ConfigurationSetting> response = configClient.getConfigurationSettingWithResponse(149 setting, // Setting with ETag150 null, // Accept datetime151 true, // ifChanged - only fetch if modified152 Context.NONE153);154155if (response.getStatusCode() == 304) {156 System.out.println("Setting not modified");157} else {158 ConfigurationSetting updated = response.getValue();159}160```161162### Update Setting163164```java165ConfigurationSetting updated = configClient.setConfigurationSetting(166 "app/cache/enabled",167 "Production",168 "false"169);170```171172### Conditional Update (If Unchanged)173174```java175// Only update if ETag matches (no concurrent modifications)176Response<ConfigurationSetting> response = configClient.setConfigurationSettingWithResponse(177 setting, // Setting with current ETag178 true, // ifUnchanged179 Context.NONE180);181```182183### Delete Setting184185```java186ConfigurationSetting deleted = configClient.deleteConfigurationSetting(187 "app/cache/enabled",188 "Production"189);190```191192### Conditional Delete193194```java195Response<ConfigurationSetting> response = configClient.deleteConfigurationSettingWithResponse(196 setting, // Setting with ETag197 true, // ifUnchanged198 Context.NONE199);200```201202## List and Filter Settings203204### List by Key Pattern205206```java207import com.azure.data.appconfiguration.models.SettingSelector;208import com.azure.core.http.rest.PagedIterable;209210SettingSelector selector = new SettingSelector()211 .setKeyFilter("app/*");212213PagedIterable<ConfigurationSetting> settings = configClient.listConfigurationSettings(selector);214for (ConfigurationSetting s : settings) {215 System.out.println(s.getKey() + " = " + s.getValue());216}217```218219### List by Label220221```java222SettingSelector selector = new SettingSelector()223 .setKeyFilter("*")224 .setLabelFilter("Production");225226PagedIterable<ConfigurationSetting> settings = configClient.listConfigurationSettings(selector);227```228229### List by Multiple Keys230231```java232SettingSelector selector = new SettingSelector()233 .setKeyFilter("app/database/*,app/cache/*");234235PagedIterable<ConfigurationSetting> settings = configClient.listConfigurationSettings(selector);236```237238### List Revisions239240```java241SettingSelector selector = new SettingSelector()242 .setKeyFilter("app/database/connection");243244PagedIterable<ConfigurationSetting> revisions = configClient.listRevisions(selector);245for (ConfigurationSetting revision : revisions) {246 System.out.println("Value: " + revision.getValue() + ", Modified: " + revision.getLastModified());247}248```249250## Feature Flags251252### Create Feature Flag253254```java255import com.azure.data.appconfiguration.models.FeatureFlagConfigurationSetting;256import com.azure.data.appconfiguration.models.FeatureFlagFilter;257import java.util.Arrays;258259FeatureFlagFilter percentageFilter = new FeatureFlagFilter("Microsoft.Percentage")260 .addParameter("Value", 50);261262FeatureFlagConfigurationSetting featureFlag = new FeatureFlagConfigurationSetting("beta-feature", true)263 .setDescription("Beta feature rollout")264 .setClientFilters(Arrays.asList(percentageFilter));265266FeatureFlagConfigurationSetting created = (FeatureFlagConfigurationSetting)267 configClient.addConfigurationSetting(featureFlag);268```269270### Get Feature Flag271272```java273FeatureFlagConfigurationSetting flag = (FeatureFlagConfigurationSetting)274 configClient.getConfigurationSetting(featureFlag);275276System.out.println("Feature: " + flag.getFeatureId());277System.out.println("Enabled: " + flag.isEnabled());278System.out.println("Filters: " + flag.getClientFilters());279```280281### Update Feature Flag282283```java284featureFlag.setEnabled(false);285FeatureFlagConfigurationSetting updated = (FeatureFlagConfigurationSetting)286 configClient.setConfigurationSetting(featureFlag);287```288289## Secret References290291### Create Secret Reference292293```java294import com.azure.data.appconfiguration.models.SecretReferenceConfigurationSetting;295296SecretReferenceConfigurationSetting secretRef = new SecretReferenceConfigurationSetting(297 "app/secrets/api-key",298 "https://myvault.vault.azure.net/secrets/api-key"299);300301SecretReferenceConfigurationSetting created = (SecretReferenceConfigurationSetting)302 configClient.addConfigurationSetting(secretRef);303```304305### Get Secret Reference306307```java308SecretReferenceConfigurationSetting ref = (SecretReferenceConfigurationSetting)309 configClient.getConfigurationSetting(secretRef);310311System.out.println("Secret URI: " + ref.getSecretId());312```313314## Read-Only Settings315316### Set Read-Only317318```java319ConfigurationSetting readOnly = configClient.setReadOnly(320 "app/critical/setting",321 "Production",322 true323);324```325326### Clear Read-Only327328```java329ConfigurationSetting writable = configClient.setReadOnly(330 "app/critical/setting",331 "Production",332 false333);334```335336## Snapshots337338### Create Snapshot339340```java341import com.azure.data.appconfiguration.models.ConfigurationSnapshot;342import com.azure.data.appconfiguration.models.ConfigurationSettingsFilter;343import com.azure.core.util.polling.SyncPoller;344import com.azure.core.util.polling.PollOperationDetails;345346List<ConfigurationSettingsFilter> filters = new ArrayList<>();347filters.add(new ConfigurationSettingsFilter("app/*"));348349SyncPoller<PollOperationDetails, ConfigurationSnapshot> poller = configClient.beginCreateSnapshot(350 "release-v1.0",351 new ConfigurationSnapshot(filters),352 Context.NONE353);354poller.setPollInterval(Duration.ofSeconds(10));355poller.waitForCompletion();356357ConfigurationSnapshot snapshot = poller.getFinalResult();358System.out.println("Snapshot: " + snapshot.getName() + ", Status: " + snapshot.getStatus());359```360361### Get Snapshot362363```java364ConfigurationSnapshot snapshot = configClient.getSnapshot("release-v1.0");365System.out.println("Created: " + snapshot.getCreatedAt());366System.out.println("Items: " + snapshot.getItemCount());367```368369### List Settings in Snapshot370371```java372PagedIterable<ConfigurationSetting> settings =373 configClient.listConfigurationSettingsForSnapshot("release-v1.0");374375for (ConfigurationSetting setting : settings) {376 System.out.println(setting.getKey() + " = " + setting.getValue());377}378```379380### Archive Snapshot381382```java383ConfigurationSnapshot archived = configClient.archiveSnapshot("release-v1.0");384System.out.println("Status: " + archived.getStatus()); // archived385```386387### Recover Snapshot388389```java390ConfigurationSnapshot recovered = configClient.recoverSnapshot("release-v1.0");391System.out.println("Status: " + recovered.getStatus()); // ready392```393394### List All Snapshots395396```java397import com.azure.data.appconfiguration.models.SnapshotSelector;398399SnapshotSelector selector = new SnapshotSelector().setNameFilter("release-*");400PagedIterable<ConfigurationSnapshot> snapshots = configClient.listSnapshots(selector);401402for (ConfigurationSnapshot snap : snapshots) {403 System.out.println(snap.getName() + " - " + snap.getStatus());404}405```406407## Labels408409### List Labels410411```java412import com.azure.data.appconfiguration.models.SettingLabelSelector;413414configClient.listLabels(new SettingLabelSelector().setNameFilter("*"))415 .forEach(label -> System.out.println("Label: " + label.getName()));416```417418## Async Operations419420```java421ConfigurationAsyncClient asyncClient = new ConfigurationClientBuilder()422 .connectionString(connectionString)423 .buildAsyncClient();424425// Async list with reactive streams426asyncClient.listConfigurationSettings(new SettingSelector().setLabelFilter("Production"))427 .subscribe(428 setting -> System.out.println(setting.getKey() + " = " + setting.getValue()),429 error -> System.err.println("Error: " + error.getMessage()),430 () -> System.out.println("Completed")431 );432```433434## Error Handling435436```java437import com.azure.core.exception.HttpResponseException;438439try {440 configClient.getConfigurationSetting("nonexistent", null);441} catch (HttpResponseException e) {442 if (e.getResponse().getStatusCode() == 404) {443 System.err.println("Setting not found");444 } else {445 System.err.println("Error: " + e.getMessage());446 }447}448```449450## Best Practices4514521. **Use labels** — Separate configurations by environment (Dev, Staging, Production)4532. **Use snapshots** — Create immutable snapshots for releases4543. **Feature flags** — Use for gradual rollouts and A/B testing4554. **Secret references** — Store sensitive values in Key Vault4565. **Conditional requests** — Use ETags for optimistic concurrency4576. **Read-only protection** — Lock critical production settings4587. **Use Entra ID** — Preferred over connection strings4598. **Async client** — Use for high-throughput scenarios460461## Reference Links462463| Resource | URL |464|----------|-----|465| Maven Package | https://central.sonatype.com/artifact/com.azure/azure-data-appconfiguration |466| GitHub | https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/appconfiguration/azure-data-appconfiguration |467| API Documentation | https://aka.ms/java-docs |468| Product Docs | https://learn.microsoft.com/azure/azure-app-configuration |469| Samples | https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/appconfiguration/azure-data-appconfiguration/src/samples |470| Troubleshooting | https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/appconfiguration/azure-data-appconfiguration/TROUBLESHOOTING.md |471
Full transparency — inspect the skill content before installing.