[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FCZS5MF792WX6CDY1HTWSM":3,"skill-same:01M6FCZS5MF792WX6CDY1HTWSM":48},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M6FCZS5MF792WX6CDY1HTWSM","azure-appconfiguration-java",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmicrosoft\u002Fskills\u002Fazure-appconfiguration-java\u002FSKILL.md",[],[18,19,20],"azure","azure appconfiguration java","java","2026-11-10 10:12:30",false,"# 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",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fmicrosoft\u002Fskills\u002Fazure-appconfiguration-java",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill azure-appconfiguration-java",{"tool":40,"command":41},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill azure-appconfiguration-java",{"tool":43,"command":44},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill azure-appconfiguration-java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmicrosoft\u002Fskills\u002Fazure-appconfiguration-java\u002FSKILL.md",true,[],[49,63,73,82,88,95],{"skillNo":50,"name":51,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":59,"publishedAt":21},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[54],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[60,61,62],"model","model hierarchy","model hierarchy skill",{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":69,"publishedAt":21},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[68],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[70,71,72],"MCP","zoom","zoom mcp",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":21},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[79,80,81,71],"sdk","zoom apps sdk","apps",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":21},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[84],{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":21},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[93],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[90],{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":21},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[97]]