[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XEHTW2XAMCT1EKK3GJK3JV":3,"skill-same:01M6XEHTW2XAMCT1EKK3GJK3JV":66},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":14,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":51,"install":52,"resources":65},"01M6XEHTW2XAMCT1EKK3GJK3JV","azure-appconfiguration-java",null,"Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fazure-appconfiguration-java\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"azure","azure appconfiguration java","java","2026","sdk","value","unknown","for","key-value","with","azure app configuration","app","feature","configuration management","flags","configuration","community","snapshots","management","settings","feature flags","2026-11-10 10:12:30",false,"---\nname: azure-appconfiguration-java\ndescription: Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nrisk: unknown\nsource: community\ndate_added: '2026-02-27'\n---\n\n# Azure App Configuration SDK for Java\n\nClient library for Azure App Configuration, a managed service for centralizing application configurations.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-data-appconfiguration\u003C\u002FartifactId>\n    \u003Cversion>1.8.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nOr use Azure SDK BOM:\n\n```xml\n\u003CdependencyManagement>\n    \u003Cdependencies>\n        \u003Cdependency>\n            \u003CgroupId>com.azure\u003C\u002FgroupId>\n            \u003CartifactId>azure-sdk-bom\u003C\u002FartifactId>\n            \u003Cversion>{bom_version}\u003C\u002Fversion>\n            \u003Ctype>pom\u003C\u002Ftype>\n            \u003Cscope>import\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\u003C\u002FdependencyManagement>\n\n\u003Cdependencies>\n    \u003Cdependency>\n        \u003CgroupId>com.azure\u003C\u002FgroupId>\n        \u003CartifactId>azure-data-appconfiguration\u003C\u002FartifactId>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n```\n\n## Prerequisites\n\n- Azure App Configuration store\n- Connection string or Entra ID credentials\n\n## Environment Variables\n\n```bash\nAZURE_APPCONFIG_CONNECTION_STRING=Endpoint=https:\u002F\u002F\u003Cstore>.azconfig.io;Id=\u003Cid>;Secret=\u003Csecret>\nAZURE_APPCONFIG_ENDPOINT=https:\u002F\u002F\u003Cstore>.azconfig.io\n```\n\n## Client Creation\n\n### With Connection String\n\n```java\nimport com.azure.data.appconfiguration.ConfigurationClient;\nimport com.azure.data.appconfiguration.ConfigurationClientBuilder;\n\nConfigurationClient configClient = new ConfigurationClientBuilder()\n    .connectionString(System.getenv(\"AZURE_APPCONFIG_CONNECTION_STRING\"))\n    .buildClient();\n```\n\n### Async Client\n\n```java\nimport com.azure.data.appconfiguration.ConfigurationAsyncClient;\n\nConfigurationAsyncClient asyncClient = new ConfigurationClientBuilder()\n    .connectionString(connectionString)\n    .buildAsyncClient();\n```\n\n### With Entra ID (Recommended)\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\nConfigurationClient configClient = new ConfigurationClientBuilder()\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .endpoint(System.getenv(\"AZURE_APPCONFIG_ENDPOINT\"))\n    .buildClient();\n```\n\n## Key Concepts\n\n| Concept | Description |\n|---------|-------------|\n| Configuration Setting | Key-value pair with optional label |\n| Label | Dimension for separating settings (e.g., environments) |\n| Feature Flag | Special setting for feature management |\n| Secret Reference | Setting pointing to Key Vault secret |\n| Snapshot | Point-in-time immutable view of settings |\n\n## Configuration Setting Operations\n\n### Create Setting (Add)\n\nCreates only if setting doesn't exist:\n\n```java\nimport com.azure.data.appconfiguration.models.ConfigurationSetting;\n\nConfigurationSetting setting = configClient.addConfigurationSetting(\n    \"app\u002Fdatabase\u002Fconnection\", \n    \"Production\", \n    \"Server=prod.db.com;Database=myapp\"\n);\n```\n\n### Create or Update Setting (Set)\n\nCreates or overwrites:\n\n```java\nConfigurationSetting setting = configClient.setConfigurationSetting(\n    \"app\u002Fcache\u002Fenabled\", \n    \"Production\", \n    \"true\"\n);\n```\n\n### Get Setting\n\n```java\nConfigurationSetting setting = configClient.getConfigurationSetting(\n    \"app\u002Fdatabase\u002Fconnection\", \n    \"Production\"\n);\nSystem.out.println(\"Value: \" + setting.getValue());\nSystem.out.println(\"Content-Type: \" + setting.getContentType());\nSystem.out.println(\"Last Modified: \" + setting.getLastModified());\n```\n\n### Conditional Get (If Changed)\n\n```java\nimport com.azure.core.http.rest.Response;\nimport com.azure.core.util.Context;\n\nResponse\u003CConfigurationSetting> response = configClient.getConfigurationSettingWithResponse(\n    setting,      \u002F\u002F Setting with ETag\n    null,         \u002F\u002F Accept datetime\n    true,         \u002F\u002F ifChanged - only fetch if modified\n    Context.NONE\n);\n\nif (response.getStatusCode() == 304) {\n    System.out.println(\"Setting not modified\");\n} else {\n    ConfigurationSetting updated = response.getValue();\n}\n```\n\n### Update Setting\n\n```java\nConfigurationSetting updated = configClient.setConfigurationSetting(\n    \"app\u002Fcache\u002Fenabled\", \n    \"Production\", \n    \"false\"\n);\n```\n\n### Conditional Update (If Unchanged)\n\n```java\n\u002F\u002F Only update if ETag matches (no concurrent modifications)\nResponse\u003CConfigurationSetting> response = configClient.setConfigurationSettingWithResponse(\n    setting,     \u002F\u002F Setting with current ETag\n    true,        \u002F\u002F ifUnchanged\n    Context.NONE\n);\n```\n\n### Delete Setting\n\n```java\nConfigurationSetting deleted = configClient.deleteConfigurationSetting(\n    \"app\u002Fcache\u002Fenabled\", \n    \"Production\"\n);\n```\n\n### Conditional Delete\n\n```java\nResponse\u003CConfigurationSetting> response = configClient.deleteConfigurationSettingWithResponse(\n    setting,     \u002F\u002F Setting with ETag\n    true,        \u002F\u002F ifUnchanged\n    Context.NONE\n);\n```\n\n## List and Filter Settings\n\n### List by Key Pattern\n\n```java\nimport com.azure.data.appconfiguration.models.SettingSelector;\nimport com.azure.core.http.rest.PagedIterable;\n\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"app\u002F*\");\n\nPagedIterable\u003CConfigurationSetting> settings = configClient.listConfigurationSettings(selector);\nfor (ConfigurationSetting s : settings) {\n    System.out.println(s.getKey() + \" = \" + s.getValue());\n}\n```\n\n### List by Label\n\n```java\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"*\")\n    .setLabelFilter(\"Production\");\n\nPagedIterable\u003CConfigurationSetting> settings = configClient.listConfigurationSettings(selector);\n```\n\n### List by Multiple Keys\n\n```java\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"app\u002Fdatabase\u002F*,app\u002Fcache\u002F*\");\n\nPagedIterable\u003CConfigurationSetting> settings = configClient.listConfigurationSettings(selector);\n```\n\n### List Revisions\n\n```java\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"app\u002Fdatabase\u002Fconnection\");\n\nPagedIterable\u003CConfigurationSetting> revisions = configClient.listRevisions(selector);\nfor (ConfigurationSetting revision : revisions) {\n    System.out.println(\"Value: \" + revision.getValue() + \", Modified: \" + revision.getLastModified());\n}\n```\n\n## Feature Flags\n\n### Create Feature Flag\n\n```java\nimport com.azure.data.appconfiguration.models.FeatureFlagConfigurationSetting;\nimport com.azure.data.appconfiguration.models.FeatureFlagFilter;\nimport java.util.Arrays;\n\nFeatureFlagFilter percentageFilter = new FeatureFlagFilter(\"Microsoft.Percentage\")\n    .addParameter(\"Value\", 50);\n\nFeatureFlagConfigurationSetting featureFlag = new FeatureFlagConfigurationSetting(\"beta-feature\", true)\n    .setDescription(\"Beta feature rollout\")\n    .setClientFilters(Arrays.asList(percentageFilter));\n\nFeatureFlagConfigurationSetting created = (FeatureFlagConfigurationSetting)\n    configClient.addConfigurationSetting(featureFlag);\n```\n\n### Get Feature Flag\n\n```java\nFeatureFlagConfigurationSetting flag = (FeatureFlagConfigurationSetting)\n    configClient.getConfigurationSetting(featureFlag);\n\nSystem.out.println(\"Feature: \" + flag.getFeatureId());\nSystem.out.println(\"Enabled: \" + flag.isEnabled());\nSystem.out.println(\"Filters: \" + flag.getClientFilters());\n```\n\n### Update Feature Flag\n\n```java\nfeatureFlag.setEnabled(false);\nFeatureFlagConfigurationSetting updated = (FeatureFlagConfigurationSetting)\n    configClient.setConfigurationSetting(featureFlag);\n```\n\n## Secret References\n\n### Create Secret Reference\n\n```java\nimport com.azure.data.appconfiguration.models.SecretReferenceConfigurationSetting;\n\nSecretReferenceConfigurationSetting secretRef = new SecretReferenceConfigurationSetting(\n    \"app\u002Fsecrets\u002Fapi-key\",\n    \"https:\u002F\u002Fmyvault.vault.azure.net\u002Fsecrets\u002Fapi-key\"\n);\n\nSecretReferenceConfigurationSetting created = (SecretReferenceConfigurationSetting)\n    configClient.addConfigurationSetting(secretRef);\n```\n\n### Get Secret Reference\n\n```java\nSecretReferenceConfigurationSetting ref = (SecretReferenceConfigurationSetting)\n    configClient.getConfigurationSetting(secretRef);\n\nSystem.out.println(\"Secret URI: \" + ref.getSecretId());\n```\n\n## Read-Only Settings\n\n### Set Read-Only\n\n```java\nConfigurationSetting readOnly = configClient.setReadOnly(\n    \"app\u002Fcritical\u002Fsetting\", \n    \"Production\", \n    true\n);\n```\n\n### Clear Read-Only\n\n```java\nConfigurationSetting writable = configClient.setReadOnly(\n    \"app\u002Fcritical\u002Fsetting\", \n    \"Production\", \n    false\n);\n```\n\n## Snapshots\n\n### Create Snapshot\n\n```java\nimport com.azure.data.appconfiguration.models.ConfigurationSnapshot;\nimport com.azure.data.appconfiguration.models.ConfigurationSettingsFilter;\nimport com.azure.core.util.polling.SyncPoller;\nimport com.azure.core.util.polling.PollOperationDetails;\n\nList\u003CConfigurationSettingsFilter> filters = new ArrayList\u003C>();\nfilters.add(new ConfigurationSettingsFilter(\"app\u002F*\"));\n\nSyncPoller\u003CPollOperationDetails, ConfigurationSnapshot> poller = configClient.beginCreateSnapshot(\n    \"release-v1.0\",\n    new ConfigurationSnapshot(filters),\n    Context.NONE\n);\npoller.setPollInterval(Duration.ofSeconds(10));\npoller.waitForCompletion();\n\nConfigurationSnapshot snapshot = poller.getFinalResult();\nSystem.out.println(\"Snapshot: \" + snapshot.getName() + \", Status: \" + snapshot.getStatus());\n```\n\n### Get Snapshot\n\n```java\nConfigurationSnapshot snapshot = configClient.getSnapshot(\"release-v1.0\");\nSystem.out.println(\"Created: \" + snapshot.getCreatedAt());\nSystem.out.println(\"Items: \" + snapshot.getItemCount());\n```\n\n### List Settings in Snapshot\n\n```java\nPagedIterable\u003CConfigurationSetting> settings = \n    configClient.listConfigurationSettingsForSnapshot(\"release-v1.0\");\n\nfor (ConfigurationSetting setting : settings) {\n    System.out.println(setting.getKey() + \" = \" + setting.getValue());\n}\n```\n\n### Archive Snapshot\n\n```java\nConfigurationSnapshot archived = configClient.archiveSnapshot(\"release-v1.0\");\nSystem.out.println(\"Status: \" + archived.getStatus()); \u002F\u002F archived\n```\n\n### Recover Snapshot\n\n```java\nConfigurationSnapshot recovered = configClient.recoverSnapshot(\"release-v1.0\");\nSystem.out.println(\"Status: \" + recovered.getStatus()); \u002F\u002F ready\n```\n\n### List All Snapshots\n\n```java\nimport com.azure.data.appconfiguration.models.SnapshotSelector;\n\nSnapshotSelector selector = new SnapshotSelector().setNameFilter(\"release-*\");\nPagedIterable\u003CConfigurationSnapshot> snapshots = configClient.listSnapshots(selector);\n\nfor (ConfigurationSnapshot snap : snapshots) {\n    System.out.println(snap.getName() + \" - \" + snap.getStatus());\n}\n```\n\n## Labels\n\n### List Labels\n\n```java\nimport com.azure.data.appconfiguration.models.SettingLabelSelector;\n\nconfigClient.listLabels(new SettingLabelSelector().setNameFilter(\"*\"))\n    .forEach(label -> System.out.println(\"Label: \" + label.getName()));\n```\n\n## Async Operations\n\n```java\nConfigurationAsyncClient asyncClient = new ConfigurationClientBuilder()\n    .connectionString(connectionString)\n    .buildAsyncClient();\n\n\u002F\u002F Async list with reactive streams\nasyncClient.listConfigurationSettings(new SettingSelector().setLabelFilter(\"Production\"))\n    .subscribe(\n        setting -> System.out.println(setting.getKey() + \" = \" + setting.getValue()),\n        error -> System.err.println(\"Error: \" + error.getMessage()),\n        () -> System.out.println(\"Completed\")\n    );\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\n\ntry {\n    configClient.getConfigurationSetting(\"nonexistent\", null);\n} catch (HttpResponseException e) {\n    if (e.getResponse().getStatusCode() == 404) {\n        System.err.println(\"Setting not found\");\n    } else {\n        System.err.println(\"Error: \" + e.getMessage());\n    }\n}\n```\n\n## Best Practices\n\n1. **Use labels** — Separate configurations by environment (Dev, Staging, Production)\n2. **Use snapshots** — Create immutable snapshots for releases\n3. **Feature flags** — Use for gradual rollouts and A\u002FB testing\n4. **Secret references** — Store sensitive values in Key Vault\n5. **Conditional requests** — Use ETags for optimistic concurrency\n6. **Read-only protection** — Lock critical production settings\n7. **Use Entra ID** — Preferred over connection strings\n8. **Async client** — Use for high-throughput scenarios\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| Maven Package | https:\u002F\u002Fcentral.sonatype.com\u002Fartifact\u002Fcom.azure\u002Fazure-data-appconfiguration |\n| GitHub | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-java\u002Ftree\u002Fmain\u002Fsdk\u002Fappconfiguration\u002Fazure-data-appconfiguration |\n| API Documentation | https:\u002F\u002Faka.ms\u002Fjava-docs |\n| Product Docs | https:\u002F\u002Flearn.microsoft.com\u002Fazure\u002Fazure-app-configuration |\n| Samples | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-java\u002Ftree\u002Fmain\u002Fsdk\u002Fappconfiguration\u002Fazure-data-appconfiguration\u002Fsrc\u002Fsamples |\n| Troubleshooting | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-java\u002Fblob\u002Fmain\u002Fsdk\u002Fappconfiguration\u002Fazure-data-appconfiguration\u002FTROUBLESHOOTING.md |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n","# Azure App Configuration SDK for Java\n\nClient library for Azure App Configuration, a managed service for centralizing application configurations.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-data-appconfiguration\u003C\u002FartifactId>\n    \u003Cversion>1.8.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\nOr use Azure SDK BOM:\n\n```xml\n\u003CdependencyManagement>\n    \u003Cdependencies>\n        \u003Cdependency>\n            \u003CgroupId>com.azure\u003C\u002FgroupId>\n            \u003CartifactId>azure-sdk-bom\u003C\u002FartifactId>\n            \u003Cversion>{bom_version}\u003C\u002Fversion>\n            \u003Ctype>pom\u003C\u002Ftype>\n            \u003Cscope>import\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\u003C\u002FdependencyManagement>\n\n\u003Cdependencies>\n    \u003Cdependency>\n        \u003CgroupId>com.azure\u003C\u002FgroupId>\n        \u003CartifactId>azure-data-appconfiguration\u003C\u002FartifactId>\n    \u003C\u002Fdependency>\n\u003C\u002Fdependencies>\n```\n\n## Prerequisites\n\n- Azure App Configuration store\n- Connection string or Entra ID credentials\n\n## Environment Variables\n\n```bash\nAZURE_APPCONFIG_CONNECTION_STRING=Endpoint=https:\u002F\u002F\u003Cstore>.azconfig.io;Id=\u003Cid>;Secret=\u003Csecret>\nAZURE_APPCONFIG_ENDPOINT=https:\u002F\u002F\u003Cstore>.azconfig.io\n```\n\n## Client Creation\n\n### With Connection String\n\n```java\nimport com.azure.data.appconfiguration.ConfigurationClient;\nimport com.azure.data.appconfiguration.ConfigurationClientBuilder;\n\nConfigurationClient configClient = new ConfigurationClientBuilder()\n    .connectionString(System.getenv(\"AZURE_APPCONFIG_CONNECTION_STRING\"))\n    .buildClient();\n```\n\n### Async Client\n\n```java\nimport com.azure.data.appconfiguration.ConfigurationAsyncClient;\n\nConfigurationAsyncClient asyncClient = new ConfigurationClientBuilder()\n    .connectionString(connectionString)\n    .buildAsyncClient();\n```\n\n### With Entra ID (Recommended)\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\nConfigurationClient configClient = new ConfigurationClientBuilder()\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .endpoint(System.getenv(\"AZURE_APPCONFIG_ENDPOINT\"))\n    .buildClient();\n```\n\n## Key Concepts\n\n| Concept | Description |\n|---------|-------------|\n| Configuration Setting | Key-value pair with optional label |\n| Label | Dimension for separating settings (e.g., environments) |\n| Feature Flag | Special setting for feature management |\n| Secret Reference | Setting pointing to Key Vault secret |\n| Snapshot | Point-in-time immutable view of settings |\n\n## Configuration Setting Operations\n\n### Create Setting (Add)\n\nCreates only if setting doesn't exist:\n\n```java\nimport com.azure.data.appconfiguration.models.ConfigurationSetting;\n\nConfigurationSetting setting = configClient.addConfigurationSetting(\n    \"app\u002Fdatabase\u002Fconnection\", \n    \"Production\", \n    \"Server=prod.db.com;Database=myapp\"\n);\n```\n\n### Create or Update Setting (Set)\n\nCreates or overwrites:\n\n```java\nConfigurationSetting setting = configClient.setConfigurationSetting(\n    \"app\u002Fcache\u002Fenabled\", \n    \"Production\", \n    \"true\"\n);\n```\n\n### Get Setting\n\n```java\nConfigurationSetting setting = configClient.getConfigurationSetting(\n    \"app\u002Fdatabase\u002Fconnection\", \n    \"Production\"\n);\nSystem.out.println(\"Value: \" + setting.getValue());\nSystem.out.println(\"Content-Type: \" + setting.getContentType());\nSystem.out.println(\"Last Modified: \" + setting.getLastModified());\n```\n\n### Conditional Get (If Changed)\n\n```java\nimport com.azure.core.http.rest.Response;\nimport com.azure.core.util.Context;\n\nResponse\u003CConfigurationSetting> response = configClient.getConfigurationSettingWithResponse(\n    setting,      \u002F\u002F Setting with ETag\n    null,         \u002F\u002F Accept datetime\n    true,         \u002F\u002F ifChanged - only fetch if modified\n    Context.NONE\n);\n\nif (response.getStatusCode() == 304) {\n    System.out.println(\"Setting not modified\");\n} else {\n    ConfigurationSetting updated = response.getValue();\n}\n```\n\n### Update Setting\n\n```java\nConfigurationSetting updated = configClient.setConfigurationSetting(\n    \"app\u002Fcache\u002Fenabled\", \n    \"Production\", \n    \"false\"\n);\n```\n\n### Conditional Update (If Unchanged)\n\n```java\n\u002F\u002F Only update if ETag matches (no concurrent modifications)\nResponse\u003CConfigurationSetting> response = configClient.setConfigurationSettingWithResponse(\n    setting,     \u002F\u002F Setting with current ETag\n    true,        \u002F\u002F ifUnchanged\n    Context.NONE\n);\n```\n\n### Delete Setting\n\n```java\nConfigurationSetting deleted = configClient.deleteConfigurationSetting(\n    \"app\u002Fcache\u002Fenabled\", \n    \"Production\"\n);\n```\n\n### Conditional Delete\n\n```java\nResponse\u003CConfigurationSetting> response = configClient.deleteConfigurationSettingWithResponse(\n    setting,     \u002F\u002F Setting with ETag\n    true,        \u002F\u002F ifUnchanged\n    Context.NONE\n);\n```\n\n## List and Filter Settings\n\n### List by Key Pattern\n\n```java\nimport com.azure.data.appconfiguration.models.SettingSelector;\nimport com.azure.core.http.rest.PagedIterable;\n\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"app\u002F*\");\n\nPagedIterable\u003CConfigurationSetting> settings = configClient.listConfigurationSettings(selector);\nfor (ConfigurationSetting s : settings) {\n    System.out.println(s.getKey() + \" = \" + s.getValue());\n}\n```\n\n### List by Label\n\n```java\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"*\")\n    .setLabelFilter(\"Production\");\n\nPagedIterable\u003CConfigurationSetting> settings = configClient.listConfigurationSettings(selector);\n```\n\n### List by Multiple Keys\n\n```java\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"app\u002Fdatabase\u002F*,app\u002Fcache\u002F*\");\n\nPagedIterable\u003CConfigurationSetting> settings = configClient.listConfigurationSettings(selector);\n```\n\n### List Revisions\n\n```java\nSettingSelector selector = new SettingSelector()\n    .setKeyFilter(\"app\u002Fdatabase\u002Fconnection\");\n\nPagedIterable\u003CConfigurationSetting> revisions = configClient.listRevisions(selector);\nfor (ConfigurationSetting revision : revisions) {\n    System.out.println(\"Value: \" + revision.getValue() + \", Modified: \" + revision.getLastModified());\n}\n```\n\n## Feature Flags\n\n### Create Feature Flag\n\n```java\nimport com.azure.data.appconfiguration.models.FeatureFlagConfigurationSetting;\nimport com.azure.data.appconfiguration.models.FeatureFlagFilter;\nimport java.util.Arrays;\n\nFeatureFlagFilter percentageFilter = new FeatureFlagFilter(\"Microsoft.Percentage\")\n    .addParameter(\"Value\", 50);\n\nFeatureFlagConfigurationSetting featureFlag = new FeatureFlagConfigurationSetting(\"beta-feature\", true)\n    .setDescription(\"Beta feature rollout\")\n    .setClientFilters(Arrays.asList(percentageFilter));\n\nFeatureFlagConfigurationSetting created = (FeatureFlagConfigurationSetting)\n    configClient.addConfigurationSetting(featureFlag);\n```\n\n### Get Feature Flag\n\n```java\nFeatureFlagConfigurationSetting flag = (FeatureFlagConfigurationSetting)\n    configClient.getConfigurationSetting(featureFlag);\n\nSystem.out.println(\"Feature: \" + flag.getFeatureId());\nSystem.out.println(\"Enabled: \" + flag.isEnabled());\nSystem.out.println(\"Filters: \" + flag.getClientFilters());\n```\n\n### Update Feature Flag\n\n```java\nfeatureFlag.setEnabled(false);\nFeatureFlagConfigurationSetting updated = (FeatureFlagConfigurationSetting)\n    configClient.setConfigurationSetting(featureFlag);\n```\n\n## Secret References\n\n### Create Secret Reference\n\n```java\nimport com.azure.data.appconfiguration.models.SecretReferenceConfigurationSetting;\n\nSecretReferenceConfigurationSetting secretRef = new SecretReferenceConfigurationSetting(\n    \"app\u002Fsecrets\u002Fapi-key\",\n    \"https:\u002F\u002Fmyvault.vault.azure.net\u002Fsecrets\u002Fapi-key\"\n);\n\nSecretReferenceConfigurationSetting created = (SecretReferenceConfigurationSetting)\n    configClient.addConfigurationSetting(secretRef);\n```\n\n### Get Secret Reference\n\n```java\nSecretReferenceConfigurationSetting ref = (SecretReferenceConfigurationSetting)\n    configClient.getConfigurationSetting(secretRef);\n\nSystem.out.println(\"Secret URI: \" + ref.getSecretId());\n```\n\n## Read-Only Settings\n\n### Set Read-Only\n\n```java\nConfigurationSetting readOnly = configClient.setReadOnly(\n    \"app\u002Fcritical\u002Fsetting\", \n    \"Production\", \n    true\n);\n```\n\n### Clear Read-Only\n\n```java\nConfigurationSetting writable = configClient.setReadOnly(\n    \"app\u002Fcritical\u002Fsetting\", \n    \"Production\", \n    false\n);\n```\n\n## Snapshots\n\n### Create Snapshot\n\n```java\nimport com.azure.data.appconfiguration.models.ConfigurationSnapshot;\nimport com.azure.data.appconfiguration.models.ConfigurationSettingsFilter;\nimport com.azure.core.util.polling.SyncPoller;\nimport com.azure.core.util.polling.PollOperationDetails;\n\nList\u003CConfigurationSettingsFilter> filters = new ArrayList\u003C>();\nfilters.add(new ConfigurationSettingsFilter(\"app\u002F*\"));\n\nSyncPoller\u003CPollOperationDetails, ConfigurationSnapshot> poller = configClient.beginCreateSnapshot(\n    \"release-v1.0\",\n    new ConfigurationSnapshot(filters),\n    Context.NONE\n);\npoller.setPollInterval(Duration.ofSeconds(10));\npoller.waitForCompletion();\n\nConfigurationSnapshot snapshot = poller.getFinalResult();\nSystem.out.println(\"Snapshot: \" + snapshot.getName() + \", Status: \" + snapshot.getStatus());\n```\n\n### Get Snapshot\n\n```java\nConfigurationSnapshot snapshot = configClient.getSnapshot(\"release-v1.0\");\nSystem.out.println(\"Created: \" + snapshot.getCreatedAt());\nSystem.out.println(\"Items: \" + snapshot.getItemCount());\n```\n\n### List Settings in Snapshot\n\n```java\nPagedIterable\u003CConfigurationSetting> settings = \n    configClient.listConfigurationSettingsForSnapshot(\"release-v1.0\");\n\nfor (ConfigurationSetting setting : settings) {\n    System.out.println(setting.getKey() + \" = \" + setting.getValue());\n}\n```\n\n### Archive Snapshot\n\n```java\nConfigurationSnapshot archived = configClient.archiveSnapshot(\"release-v1.0\");\nSystem.out.println(\"Status: \" + archived.getStatus()); \u002F\u002F archived\n```\n\n### Recover Snapshot\n\n```java\nConfigurationSnapshot recovered = configClient.recoverSnapshot(\"release-v1.0\");\nSystem.out.println(\"Status: \" + recovered.getStatus()); \u002F\u002F ready\n```\n\n### List All Snapshots\n\n```java\nimport com.azure.data.appconfiguration.models.SnapshotSelector;\n\nSnapshotSelector selector = new SnapshotSelector().setNameFilter(\"release-*\");\nPagedIterable\u003CConfigurationSnapshot> snapshots = configClient.listSnapshots(selector);\n\nfor (ConfigurationSnapshot snap : snapshots) {\n    System.out.println(snap.getName() + \" - \" + snap.getStatus());\n}\n```\n\n## Labels\n\n### List Labels\n\n```java\nimport com.azure.data.appconfiguration.models.SettingLabelSelector;\n\nconfigClient.listLabels(new SettingLabelSelector().setNameFilter(\"*\"))\n    .forEach(label -> System.out.println(\"Label: \" + label.getName()));\n```\n\n## Async Operations\n\n```java\nConfigurationAsyncClient asyncClient = new ConfigurationClientBuilder()\n    .connectionString(connectionString)\n    .buildAsyncClient();\n\n\u002F\u002F Async list with reactive streams\nasyncClient.listConfigurationSettings(new SettingSelector().setLabelFilter(\"Production\"))\n    .subscribe(\n        setting -> System.out.println(setting.getKey() + \" = \" + setting.getValue()),\n        error -> System.err.println(\"Error: \" + error.getMessage()),\n        () -> System.out.println(\"Completed\")\n    );\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\n\ntry {\n    configClient.getConfigurationSetting(\"nonexistent\", null);\n} catch (HttpResponseException e) {\n    if (e.getResponse().getStatusCode() == 404) {\n        System.err.println(\"Setting not found\");\n    } else {\n        System.err.println(\"Error: \" + e.getMessage());\n    }\n}\n```\n\n## Best Practices\n\n1. **Use labels** — Separate configurations by environment (Dev, Staging, Production)\n2. **Use snapshots** — Create immutable snapshots for releases\n3. **Feature flags** — Use for gradual rollouts and A\u002FB testing\n4. **Secret references** — Store sensitive values in Key Vault\n5. **Conditional requests** — Use ETags for optimistic concurrency\n6. **Read-only protection** — Lock critical production settings\n7. **Use Entra ID** — Preferred over connection strings\n8. **Async client** — Use for high-throughput scenarios\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| Maven Package | https:\u002F\u002Fcentral.sonatype.com\u002Fartifact\u002Fcom.azure\u002Fazure-data-appconfiguration |\n| GitHub | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-java\u002Ftree\u002Fmain\u002Fsdk\u002Fappconfiguration\u002Fazure-data-appconfiguration |\n| API Documentation | https:\u002F\u002Faka.ms\u002Fjava-docs |\n| Product Docs | https:\u002F\u002Flearn.microsoft.com\u002Fazure\u002Fazure-app-configuration |\n| Samples | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-java\u002Ftree\u002Fmain\u002Fsdk\u002Fappconfiguration\u002Fazure-data-appconfiguration\u002Fsrc\u002Fsamples |\n| Troubleshooting | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-java\u002Fblob\u002Fmain\u002Fsdk\u002Fappconfiguration\u002Fazure-data-appconfiguration\u002FTROUBLESHOOTING.md |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{"name":5,"risk":25,"source":35,"date_added":45,"description":7},"2026-02-27","main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fcopilot\u002Fazure-appconfiguration-java","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill azure-appconfiguration-java",{"tool":58,"command":59},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill azure-appconfiguration-java",{"tool":61,"command":62},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill azure-appconfiguration-java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fazure-appconfiguration-java\u002FSKILL.md",true,[],[67,90,116,126,139,158],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":78,"publishedAt":40},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[79,80,81,82,83,84,85,86,87,88,89,28],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":40},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[97,98,99,100,101,102,81,103,104,105,106,107,108,109,110,111,112,113,114,115],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across","api",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":40},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[123,124,97,108,109,110,111,101,81,113,125,114,115,107,105,104,103,112,102,100],"trend radar","radar","pulse",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":40},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[133,134,135,136,137,138],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":150,"publishedAt":40},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":148,"taxonomyTypeDesc":149},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[141,87,151,152,153,28,108,154,155,156,99,157,112],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":40},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[160,165,166,167,112,168,155,169,170,171,172,173],"status","play","go","latest","github","discover","control","cmd","volume"]