CINXE.COM
<!doctype html> <html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-reference/technologies/server/java" data-has-hydrated="false"> <head> <meta charset="UTF-8"> <meta name="generator" content="Docusaurus v3.7.0"> <title data-rh="true">OpenFeature Java SDK | OpenFeature</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://openfeature.dev/img/opengraph.jpg"><meta data-rh="true" name="twitter:image" content="https://openfeature.dev/img/opengraph.jpg"><meta data-rh="true" property="og:url" content="https://openfeature.dev/docs/reference/technologies/server/java"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="OpenFeature Java SDK | OpenFeature"><meta data-rh="true" name="description" content="<!--"><meta data-rh="true" property="og:description" content="<!--"><link data-rh="true" rel="canonical" href="https://openfeature.dev/docs/reference/technologies/server/java"><link data-rh="true" rel="alternate" href="https://openfeature.dev/docs/reference/technologies/server/java" hreflang="en"><link data-rh="true" rel="alternate" href="https://openfeature.dev/docs/reference/technologies/server/java" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://PH0VDWFP7Q-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="OpenFeature RSS Feed"> <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="OpenFeature Atom Feed"> <link rel="search" type="application/opensearchdescription+xml" title="OpenFeature" href="/opensearch.xml"> <link rel="preconnect" href="https://www.google-analytics.com"> <link rel="preconnect" href="https://www.googletagmanager.com"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-ZG0JSPYJXZ"></script> <script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-ZG0JSPYJXZ",{anonymize_ip:!0})</script> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon-precomposed.png"> <link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png"> <link rel="icon" type="image/svg+xml" href="/favicons/favicon-light.svg"> <link rel="shortcut icon" type="image/x-icon" href="/favicons/favicon.ico"> <link rel="manifest" href="/favicons/site.webmanifest"> <meta name="theme-color" content="#ffffff"> <meta name="msapplication-config" content="/favicons/browserconfig.xml"><link rel="stylesheet" href="/assets/css/styles.385ab5b9.css"> <script src="/assets/js/runtime~main.aa35e229.js" defer="defer"></script> <script src="/assets/js/main.2feeef09.js" defer="defer"></script> </head> <body class="navigation-with-keyboard"> <script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const a=new URLSearchParams(window.location.search).entries();for(var[t,e]of a)if(t.startsWith("docusaurus-data-")){var n=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(n,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/logo-dark.svg"><link rel="preload" as="image" href="/img/logo-light.svg"><link rel="preload" as="image" href="https://img.shields.io/static/v1?label=specification&message=v0.7.0&color=yellow&style=for-the-badge"><link rel="preload" as="image" href="https://img.shields.io/static/v1?label=release&message=v1.14.1&color=blue&style=for-the-badge"><link rel="preload" as="image" href="https://javadoc.io/badge2/dev.openfeature/sdk/javadoc.svg"><link rel="preload" as="image" href="https://maven-badges.herokuapp.com/maven-central/dev.openfeature/sdk/badge.svg"><link rel="preload" as="image" href="https://codecov.io/gh/open-feature/java-sdk/branch/main/graph/badge.svg?token=XMS9L7PBY1"><link rel="preload" as="image" href="https://bestpractices.coreinfrastructure.org/projects/6241/badge"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">We're back! Check out all the ways you can connect with us at <a href="/blog/kubeconeu25">KubeCon + CloudNativeCon Europe 2025</a>.</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo-dark.svg" alt="OpenFeature Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo-light.svg" alt="OpenFeature Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate"></b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/reference/intro">Docs</a><a class="navbar__item navbar__link" href="/specification/">Specification</a><a class="navbar__item navbar__link" href="/ecosystem">Ecosystem</a><a class="navbar__item navbar__link" href="/community/">Community</a><a class="navbar__item navbar__link" href="/support-training">Support & Training</a><a class="navbar__item navbar__link" href="/docs/tutorials/five-minutes-to-feature-flags">Tutorials</a><a class="navbar__item navbar__link" href="/blog">Blog</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link header-github-link" aria-label="GitHub organization"></a><div class="toggle_nTvT colorModeToggle_DEke"><button class="clean-btn toggleButton_gYZh toggleButtonDisabled_zh5C" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><div class="toggleLogo_HXbd"><div class="toggleIcon_U8RU"><div class="track_Vm51"><div></div></div></div></div></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/reference/intro">Introduction</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/category/concepts">Concepts</a><button aria-label="Collapse sidebar category 'Concepts'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/evaluation-api">Evaluation API</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/provider">Providers</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/evaluation-context">Evaluation Context</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/hooks">Hooks</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/events">Events</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/sdk-paradigms">SDK Paradigms</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/concepts/tracking">Tracking</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/docs/reference/technologies/">Technologies</a><button aria-label="Collapse sidebar category 'Technologies'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/sdk-compatibility">SDK Compatibility Overview</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" tabindex="0" href="/docs/reference/technologies/server/">Server</a><button aria-label="Collapse sidebar category 'Server'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/dotnet">.NET</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/go">Go</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/reference/technologies/server/java">Java</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/reference/technologies/server/javascript/">Node.js</a><button aria-label="Collapse sidebar category 'Node.js'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/javascript/nestjs">NestJS</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/php">PHP</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/python">Python</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/ruby">Ruby</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/server/rust">Rust</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/reference/technologies/client/">Client</a><button aria-label="Collapse sidebar category 'Client'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/kotlin">Android</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/swift">iOS</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" tabindex="0" href="/docs/reference/technologies/client/web/">Web</a><button aria-label="Collapse sidebar category 'Web'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/web/angular">Angular</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/reference/technologies/client/web/react">React</a></li></ul></li></ul></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/reference/contributing">Contributing</a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/reference/technologies/"><span itemprop="name">Technologies</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/reference/technologies/server/"><span itemprop="name">Server</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Java</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>OpenFeature Java SDK</h1></header><p align="center" class="github-badges"><a href="https://github.com/open-feature/spec/releases/tag/v0.7.0"><img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.7.0&color=yellow&style=for-the-badge"></a><a href="https://github.com/open-feature/java-sdk/releases/tag/v1.14.1"><img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.14.1&color=blue&style=for-the-badge"></a><br><a href="https://javadoc.io/doc/dev.openfeature/sdk"><img alt="Javadoc" src="https://javadoc.io/badge2/dev.openfeature/sdk/javadoc.svg"></a><a href="https://maven-badges.herokuapp.com/maven-central/dev.openfeature/sdk"><img alt="Maven Central" src="https://maven-badges.herokuapp.com/maven-central/dev.openfeature/sdk/badge.svg"></a><a href="https://codecov.io/gh/open-feature/java-sdk"><img alt="Codecov" src="https://codecov.io/gh/open-feature/java-sdk/branch/main/graph/badge.svg?token=XMS9L7PBY1"></a><a href="https://bestpractices.coreinfrastructure.org/projects/6241"><img alt="CII Best Practices" src="https://bestpractices.coreinfrastructure.org/projects/6241/badge"></a></p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick start<a href="#quick-start" class="hash-link" aria-label="Direct link to Quick start" title="Direct link to Quick start"></a></h2> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="requirements">Requirements<a href="#requirements" class="hash-link" aria-label="Direct link to Requirements" title="Direct link to Requirements"></a></h3> <ul> <li>Java 8+ (compiler target is 1.8)</li> </ul> <p>Note that this library is intended to be used in server-side contexts and has not been evaluated for use on mobile devices.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="install">Install<a href="#install" class="hash-link" aria-label="Direct link to Install" title="Direct link to Install"></a></h3> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="maven">Maven<a href="#maven" class="hash-link" aria-label="Direct link to Maven" title="Direct link to Maven"></a></h4> <div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">dependency</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">groupId</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain">dev.openfeature</span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">groupId</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">artifactId</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain">sdk</span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">artifactId</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">version</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain">1.14.1</span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">version</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">dependency</span><span class="token tag punctuation" style="color:#8dc891">></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>If you would like snapshot builds, this is the relevant repository information:</p> <div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">repositories</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">repository</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">snapshots</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">enabled</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain">true</span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">enabled</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">snapshots</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">id</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain">sonatype</span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">id</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">name</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain">Sonatype Repository</span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">name</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"><</span><span class="token tag" style="color:#fc929e">url</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain">https://s01.oss.sonatype.org/content/repositories/snapshots/</span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">url</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">repository</span><span class="token tag punctuation" style="color:#8dc891">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token tag punctuation" style="color:#8dc891"></</span><span class="token tag" style="color:#fc929e">repositories</span><span class="token tag punctuation" style="color:#8dc891">></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="gradle">Gradle<a href="#gradle" class="hash-link" aria-label="Direct link to Gradle" title="Direct link to Gradle"></a></h4> <div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain">dependencies {</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> implementation 'dev.openfeature:sdk:1.14.1'</span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="usage">Usage<a href="#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage"></a></h3> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">example</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// flags defined in memory</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Map</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">String</span><span class="token generics punctuation" style="color:#8dc891">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#FAC863">Flag</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics operator" style="color:#d7deea">?</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> myFlags </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">HashMap</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> myFlags</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">put</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"v2_enabled"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Flag</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">builder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">variant</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"on"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">true</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">variant</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"off"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">defaultVariant</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"on"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// configure a provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token plain"> api </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setProviderAndWait</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">InMemoryProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">myFlags</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// create a client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Client</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// get a bool flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">boolean</span><span class="token plain"> flagValue </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getBooleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"v2_enabled"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="api-reference">API Reference<a href="#api-reference" class="hash-link" aria-label="Direct link to API Reference" title="Direct link to API Reference"></a></h3> <p>See <a href="https://javadoc.io/doc/dev.openfeature/sdk/latest/" target="_blank" rel="noopener noreferrer">here</a> for the Javadocs.</p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features"></a></h2> <table><thead><tr><th>Status</th><th>Features</th><th>Description</th></tr></thead><tbody><tr><td>✅</td><td><a href="#providers">Providers</a></td><td>Integrate with a commercial, open source, or in-house feature management tool.</td></tr><tr><td>✅</td><td><a href="#targeting">Targeting</a></td><td>Contextually-aware flag evaluation using <a href="/docs/reference/concepts/evaluation-context">evaluation context</a>.</td></tr><tr><td>✅</td><td><a href="#hooks">Hooks</a></td><td>Add functionality to various stages of the flag evaluation life-cycle.</td></tr><tr><td>✅</td><td><a href="#tracking">Tracking</a></td><td>Associate user actions with feature flag evaluations.</td></tr><tr><td>✅</td><td><a href="#logging">Logging</a></td><td>Integrate with popular logging packages.</td></tr><tr><td>✅</td><td><a href="#domains">Domains</a></td><td>Logically bind clients with providers.</td></tr><tr><td>✅</td><td><a href="#eventing">Eventing</a></td><td>React to state changes in the provider or flag management system.</td></tr><tr><td>✅</td><td><a href="#shutdown">Shutdown</a></td><td>Gracefully clean up a provider during application shutdown.</td></tr><tr><td>✅</td><td><a href="#transaction-context-propagation">Transaction Context Propagation</a></td><td>Set a specific <a href="/docs/reference/concepts/evaluation-context">evaluation context</a> for a transaction (e.g. an HTTP request or a thread).</td></tr><tr><td>✅</td><td><a href="#extending">Extending</a></td><td>Extend OpenFeature with custom providers and hooks.</td></tr></tbody></table> <sub>Implemented: ✅ | In-progress: ⚠️ | Not implemented yet: ❌</sub> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="providers">Providers<a href="#providers" class="hash-link" aria-label="Direct link to Providers" title="Direct link to Providers"></a></h3> <p><a href="/docs/reference/concepts/provider">Providers</a> are an abstraction between a flag management system and the OpenFeature SDK. Look <a href="/ecosystem?instant_search%5BrefinementList%5D%5Btype%5D%5B0%5D=Provider&instant_search%5BrefinementList%5D%5Btechnology%5D%5B0%5D=Java">here</a> for a complete list of available providers. If the provider you're looking for hasn't been created yet, see the <a href="#develop-a-provider">develop a provider</a> section to learn how to build it yourself.</p> <p>Once you've added a provider as a dependency, it can be registered with OpenFeature like this:</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="synchronous">Synchronous<a href="#synchronous" class="hash-link" aria-label="Direct link to Synchronous" title="Direct link to Synchronous"></a></h4> <p>To register a provider in a blocking manner to ensure it is ready before further actions are taken, you can use the <code>setProviderAndWait</code> method as shown below:</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token plain"> api </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setProviderAndWait</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="asynchronous">Asynchronous<a href="#asynchronous" class="hash-link" aria-label="Direct link to Asynchronous" title="Direct link to Asynchronous"></a></h4> <p>To register a provider in a non-blocking manner, you can use the <code>setProvider</code> method as shown below:</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>In some situations, it may be beneficial to register multiple providers in the same application. This is possible using <a href="#domains">domains</a>, which is covered in more detail below.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="targeting">Targeting<a href="#targeting" class="hash-link" aria-label="Direct link to Targeting" title="Direct link to Targeting"></a></h3> <p>Sometimes, the value of a flag must consider some dynamic criteria about the application or user, such as the user's location, IP, email address, or the server's location. In OpenFeature, we refer to this as <a href="/specification/glossary#targeting">targeting</a>. If the flag management system you're using supports targeting, you can provide the input data using the <a href="/docs/reference/concepts/evaluation-context">evaluation context</a>.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// set a value to the global context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token plain"> api </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Map</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">String</span><span class="token generics punctuation" style="color:#8dc891">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#FAC863">Value</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> apiAttrs </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">HashMap</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">apiAttrs</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">put</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"region"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Value</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">System</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getEnv</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"us-east-1"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> apiCtx </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ImmutableContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">apiAttrs</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setEvaluationContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">apiCtx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// set a value to the client context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Map</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">String</span><span class="token generics punctuation" style="color:#8dc891">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#FAC863">Value</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> clientAttrs </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">HashMap</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">clientAttrs</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">put</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"region"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Value</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">System</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getEnv</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"us-east-1"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> clientCtx </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ImmutableContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">clientAttrs</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Client</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setEvaluationContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">clientCtx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// set a value to the invocation context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Map</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">String</span><span class="token generics punctuation" style="color:#8dc891">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#FAC863">Value</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> requestAttrs </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">HashMap</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">requestAttrs</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">put</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"email"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Value</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">session</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getAttribute</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"email"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">requestAttrs</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">put</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"product"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Value</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"productId"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">String</span><span class="token plain"> targetingKey </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> session</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getId</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> reqCtx </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ImmutableContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">targetingKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> requestAttrs</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token keyword" style="color:#c5a5c5">boolean</span><span class="token plain"> flagValue </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getBooleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"some-flag"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> reqCtx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="hooks">Hooks<a href="#hooks" class="hash-link" aria-label="Direct link to Hooks" title="Direct link to Hooks"></a></h3> <p><a href="/docs/reference/concepts/hooks">Hooks</a> allow for custom logic to be added at well-defined points of the flag evaluation life-cycle Look <a href="/ecosystem?instant_search%5BrefinementList%5D%5Btype%5D%5B0%5D=Hook&instant_search%5BrefinementList%5D%5Btechnology%5D%5B0%5D=Java">here</a> for a complete list of available hooks. If the hook you're looking for hasn't been created yet, see the <a href="#develop-a-hook">develop a hook</a> section to learn how to build it yourself.</p> <p>Once you've added a hook as a dependency, it can be registered at the global, client, or flag invocation level.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// add a hook globally, to run on all evaluations</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token plain"> api </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">addHooks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ExampleHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// add a hook on this client, to run on all evaluations made by this client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Client</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">addHooks</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ExampleHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// add a hook for this evaluation only</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Boolean</span><span class="token plain"> retval </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getBooleanValue</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">flagKey</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token boolean" style="color:#ff8b50">false</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">null</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FlagEvaluationOptions</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">builder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">hook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ExampleHook</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="tracking">Tracking<a href="#tracking" class="hash-link" aria-label="Direct link to Tracking" title="Direct link to Tracking"></a></h3> <p>The <a href="/specification/sections/tracking/">tracking API</a> allows you to use OpenFeature abstractions to associate user actions with feature flag evaluations. This is essential for robust experimentation powered by feature flags. Note that, unlike methods that handle feature flag evaluations, calling <code>track(...)</code> may throw an <code>IllegalArgumentException</code> if an empty string is passed as the <code>trackingEventName</code>.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token plain"> api </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">track</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"visited-promo-page"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MutableTrackingEventDetails</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token number" style="color:#5a9bcf">99.77</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">add</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"currency"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"USD"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="logging">Logging<a href="#logging" class="hash-link" aria-label="Direct link to Logging" title="Direct link to Logging"></a></h3> <p>The Java SDK uses SLF4J. See the <a href="https://slf4j.org/manual.html" target="_blank" rel="noopener noreferrer">SLF4J manual</a> for complete documentation. Note that in accordance with the OpenFeature specification, the SDK doesn't generally log messages during flag evaluation.</p> <h4 class="anchor anchorWithStickyNavbar_LWe7" id="logging-hook">Logging Hook<a href="#logging-hook" class="hash-link" aria-label="Direct link to Logging Hook" title="Direct link to Logging Hook"></a></h4> <p>The Java SDK includes a <code>LoggingHook</code>, which logs detailed information at key points during flag evaluation, using SLF4J's structured logging API. This hook can be particularly helpful for troubleshooting and debugging; simply attach it at the global, client or invocation level and ensure your log level is set to "debug".</p> <p>See <a href="#hooks">hooks</a> for more information on configuring hooks.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="domains">Domains<a href="#domains" class="hash-link" aria-label="Direct link to Domains" title="Direct link to Domains"></a></h3> <p>Clients can be assigned to a domain. A domain is a logical identifier which can be used to associate clients with a particular provider. If a domain has no associated provider, the global provider is used.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token class-name" style="color:#FAC863">FeatureProvider</span><span class="token plain"> scopedProvider </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// registering the default provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">LocalProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// registering a provider to a domain</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"my-domain"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">CachedProvider</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// A client bound to the default provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Client</span><span class="token plain"> clientDefault </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// A client bound to the CachedProvider provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Client</span><span class="token plain"> domainScopedClient </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"my-domain"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Providers for domains can be set in a blocking or non-blocking way. For more details, please refer to the <a href="#providers">providers</a> section.</p> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="eventing">Eventing<a href="#eventing" class="hash-link" aria-label="Direct link to Eventing" title="Direct link to Eventing"></a></h3> <p>Events allow you to react to state changes in the provider or underlying flag management system, such as flag definition changes, provider readiness, or error conditions. Initialization events (<code>PROVIDER_READY</code> on success, <code>PROVIDER_ERROR</code> on failure) are dispatched for every provider. Some providers support additional events, such as <code>PROVIDER_CONFIGURATION_CHANGED</code>.</p> <p>Please refer to the documentation of the provider you're using to see what events are supported.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// add an event handler to a client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Client</span><span class="token plain"> client </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">client</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">onProviderConfigurationChanged</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">EventDetails</span><span class="token plain"> eventDetails</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-></span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// do something when the provider's flag settings change</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token comment" style="color:#999999">// add an event handler to the global API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">onProviderStale</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">EventDetails</span><span class="token plain"> eventDetails</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-></span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// do something when the provider's cache goes stale</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="shutdown">Shutdown<a href="#shutdown" class="hash-link" aria-label="Direct link to Shutdown" title="Direct link to Shutdown"></a></h3> <p>The OpenFeature API provides a close function to perform a cleanup of all registered providers. This should only be called when your application is in the process of shutting down.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// shut down all providers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">shutdown</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="transaction-context-propagation">Transaction Context Propagation<a href="#transaction-context-propagation" class="hash-link" aria-label="Direct link to Transaction Context Propagation" title="Direct link to Transaction Context Propagation"></a></h3> <p>Transaction context is a container for transaction-specific evaluation context (e.g. user id, user agent, IP). Transaction context can be set where specific data is available (e.g. an auth service or request handler) and by using the transaction context propagator it will automatically be applied to all flag evaluations within a transaction (e.g. a request or thread). By default, the <code>NoOpTransactionContextPropagator</code> is used, which doesn't store anything. To register a <code>ThreadLocal</code> context propagator, you can use the <code>setTransactionContextPropagator</code> method as shown below.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// registering the ThreadLocalTransactionContextPropagator</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setTransactionContextPropagator</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ThreadLocalTransactionContextPropagator</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Once you've registered a transaction context propagator, you can propagate the data into request-scoped transaction context.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token comment" style="color:#999999">// adding userId to transaction context</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token plain"> api </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">Map</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">String</span><span class="token generics punctuation" style="color:#8dc891">,</span><span class="token generics"> </span><span class="token generics class-name" style="color:#FAC863">Value</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> transactionAttrs </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">HashMap</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">transactionAttrs</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">put</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"userId"</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Value</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"userId"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> transactionCtx </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">new</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ImmutableContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">transactionAttrs</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain">api</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">setTransactionContext</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">transactionCtx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Additionally, you can develop a custom transaction context propagator by implementing the <code>TransactionContextPropagator</code> interface and registering it as shown above.</p> <h2 class="anchor anchorWithStickyNavbar_LWe7" id="extending">Extending<a href="#extending" class="hash-link" aria-label="Direct link to Extending" title="Direct link to Extending"></a></h2> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="develop-a-provider">Develop a provider<a href="#develop-a-provider" class="hash-link" aria-label="Direct link to Develop a provider" title="Direct link to Develop a provider"></a></h3> <p>To develop a provider, you need to create a new project and include the OpenFeature SDK as a dependency. This can be a new repository or included in <a href="https://github.com/open-feature/java-sdk-contrib" target="_blank" rel="noopener noreferrer">the existing contrib repository</a> available under the OpenFeature organization. You’ll then need to write the provider by implementing the <code>FeatureProvider</code> interface exported by the OpenFeature SDK.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyProvider</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FeatureProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Metadata</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getMetadata</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-></span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"My Provider"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">initialize</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> evaluationContext</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">throws</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Exception</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// start up your provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">shutdown</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// shut down your provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderEvaluation</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">Boolean</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getBooleanEvaluation</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">String</span><span class="token plain"> key</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Boolean</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve a boolean flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderEvaluation</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">String</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getStringEvaluation</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">String</span><span class="token plain"> key</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">String</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve a string flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderEvaluation</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">Integer</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getIntegerEvaluation</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">String</span><span class="token plain"> key</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Integer</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve an int flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderEvaluation</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">Double</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getDoubleEvaluation</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">String</span><span class="token plain"> key</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Double</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve a double flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderEvaluation</span><span class="token generics punctuation" style="color:#8dc891"><</span><span class="token generics class-name" style="color:#FAC863">Value</span><span class="token generics punctuation" style="color:#8dc891">></span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getObjectEvaluation</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">String</span><span class="token plain"> key</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Value</span><span class="token plain"> defaultValue</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// resolve an object flag value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>If you'd like your provider to support firing events, such as events for when flags are changed in the flag management system, extend <code>EventProvider</code>.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyEventProvider</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">extends</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">EventProvider</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Metadata</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">getMetadata</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-></span><span class="token plain"> </span><span class="token string" style="color:#8dc891">"My Event Provider"</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">initialize</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">EvaluationContext</span><span class="token plain"> evaluationContext</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">throws</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Exception</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// emit events when flags are changed in a hypothetical REST API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">this</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token plain">restApiClient</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">onFlagsChanged</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token operator" style="color:#d7deea">-></span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderEventDetails</span><span class="token plain"> details </span><span class="token operator" style="color:#d7deea">=</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">ProviderEventDetails</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">builder</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">message</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token string" style="color:#8dc891">"flags changed in API!"</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">build</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">this</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">emitProviderConfigurationChanged</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token plain">details</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">shutdown</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// shut down your provider</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// remaining provider methods...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <p>Providers no longer need to manage their own state, this is done by the SDK itself. If desired, the state of a provider can be queried through the client that uses the provider.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token class-name" style="color:#FAC863">OpenFeatureAPI</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getInstance</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getClient</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">.</span><span class="token function" style="color:#79b6f2">getProviderState</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <blockquote> <p>Built a new provider? <a href="https://github.com/open-feature/openfeature.dev/issues/new?assignees=&labels=provider&projects=&template=document-provider.yaml&title=%5BProvider%5D%3A+" target="_blank" rel="noopener noreferrer">Let us know</a> so we can add it to the docs!</p> </blockquote> <h3 class="anchor anchorWithStickyNavbar_LWe7" id="develop-a-hook">Develop a hook<a href="#develop-a-hook" class="hash-link" aria-label="Direct link to Develop a hook" title="Direct link to Develop a hook"></a></h3> <p>To develop a hook, you need to create a new project and include the OpenFeature SDK as a dependency. This can be a new repository or included in <a href="https://github.com/open-feature/java-sdk-contrib" target="_blank" rel="noopener noreferrer">the existing contrib repository</a> available under the OpenFeature organization. Implement your own hook by conforming to the <code>Hook interface</code>.</p> <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-background-color:#282c34;--prism-color:#ffffff"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="background-color:#282c34;color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#ffffff"><span class="token keyword" style="color:#c5a5c5">class</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">MyHook</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">implements</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Hook</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Optional</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">before</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Map</span><span class="token plain"> hints</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code that runs before the flag evaluation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">after</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FlagEvaluationDetails</span><span class="token plain"> details</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Map</span><span class="token plain"> hints</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code that runs after the flag evaluation succeeds</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">error</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Exception</span><span class="token plain"> error</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Map</span><span class="token plain"> hints</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code that runs when there's an error during a flag evaluation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#8dc891">@Override</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">public</span><span class="token plain"> </span><span class="token keyword" style="color:#c5a5c5">void</span><span class="token plain"> </span><span class="token function" style="color:#79b6f2">finallyAfter</span><span class="token punctuation" style="color:#8dc891">(</span><span class="token class-name" style="color:#FAC863">HookContext</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">FlagEvaluationDetails</span><span class="token plain"> details</span><span class="token punctuation" style="color:#8dc891">,</span><span class="token plain"> </span><span class="token class-name" style="color:#FAC863">Map</span><span class="token plain"> hints</span><span class="token punctuation" style="color:#8dc891">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token comment" style="color:#999999">// code that runs regardless of success or error</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"> </span><span class="token punctuation" style="color:#8dc891">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#ffffff"><span class="token plain"></span><span class="token punctuation" style="color:#8dc891">}</span><span class="token punctuation" style="color:#8dc891">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div> <blockquote> <p>Built a new hook? <a href="https://github.com/open-feature/openfeature.dev/issues/new?assignees=&labels=hook&projects=&template=document-hook.yaml&title=%5BHook%5D%3A+" target="_blank" rel="noopener noreferrer">Let us know</a> so we can add it to the docs!</p> </blockquote></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/open-feature/openfeature.dev/edit/main/docs/reference/technologies/server/java.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/reference/technologies/server/go"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Go</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/reference/technologies/server/javascript/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Node.js</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#quick-start" class="table-of-contents__link toc-highlight">Quick start</a><ul><li><a href="#requirements" class="table-of-contents__link toc-highlight">Requirements</a></li><li><a href="#install" class="table-of-contents__link toc-highlight">Install</a></li><li><a href="#usage" class="table-of-contents__link toc-highlight">Usage</a></li><li><a href="#api-reference" class="table-of-contents__link toc-highlight">API Reference</a></li></ul></li><li><a href="#features" class="table-of-contents__link toc-highlight">Features</a><ul><li><a href="#providers" class="table-of-contents__link toc-highlight">Providers</a></li><li><a href="#targeting" class="table-of-contents__link toc-highlight">Targeting</a></li><li><a href="#hooks" class="table-of-contents__link toc-highlight">Hooks</a></li><li><a href="#tracking" class="table-of-contents__link toc-highlight">Tracking</a></li><li><a href="#logging" class="table-of-contents__link toc-highlight">Logging</a></li><li><a href="#domains" class="table-of-contents__link toc-highlight">Domains</a></li><li><a href="#eventing" class="table-of-contents__link toc-highlight">Eventing</a></li><li><a href="#shutdown" class="table-of-contents__link toc-highlight">Shutdown</a></li><li><a href="#transaction-context-propagation" class="table-of-contents__link toc-highlight">Transaction Context Propagation</a></li></ul></li><li><a href="#extending" class="table-of-contents__link toc-highlight">Extending</a><ul><li><a href="#develop-a-provider" class="table-of-contents__link toc-highlight">Develop a provider</a></li><li><a href="#develop-a-hook" class="table-of-contents__link toc-highlight">Develop a hook</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Sections</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/reference/intro">Docs</a></li><li class="footer__item"><a class="footer__link-item" href="/specification">Specification</a></li><li class="footer__item"><a class="footer__link-item" href="/community">Community</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/tutorials/five-minutes-to-feature-flags">Tutorials</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://bsky.app/profile/openfeature.dev" target="_blank" rel="noopener noreferrer" class="footer__link-item">BlueSky<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/openfeature" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.linkedin.com/company/openfeature/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://cloud-native.slack.com/archives/C0344AANLA1" target="_blank" rel="noopener noreferrer" class="footer__link-item">Join us on Slack<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.youtube.com/@openfeature" target="_blank" rel="noopener noreferrer" class="footer__link-item">YouTube<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/open-feature" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.linuxfoundation.org/legal/trademark-usage" target="_blank" rel="noopener noreferrer" class="footer__link-item">Trademarks<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"> <a href="https://www.netlify.com" target="_blank" rel="noreferrer noopener" aria-label="Deploys by Netlify"> <img src="https://www.netlify.com/img/global/badges/netlify-color-accent.svg" alt="Deploys by Netlify" width="114" height="51"> </a> </li></ul></div></div><div class="footer__bottom text--center"><svg xmlns="http://www.w3.org/2000/svg" viewBox="-1.81 -3.06 419.38 80.13" style="width:300px"><style>.st0{fill:#fff}</style><g id="XMLID_1_"><g id="XMLID_575_"><path id="XMLID_643_" d="M102.2 33c3.3 0 5.9-1.3 8-3.9l4.3 4.4c-3.4 3.8-7.3 5.7-11.9 5.7s-8.3-1.4-11.3-4.3-4.4-6.5-4.4-10.9 1.5-8.1 4.5-11 6.7-4.4 11.1-4.4c4.9 0 9 1.9 12.2 5.6l-4.1 4.7q-3.15-3.9-7.8-3.9c-2.5 0-4.6.8-6.4 2.4s-2.7 3.8-2.7 6.6.8 5 2.5 6.7c1.6 1.4 3.6 2.3 6 2.3" class="st0"></path><path id="XMLID_641_" d="M119.7 38.8V9.1h6.6v23.8H139v5.9z" class="st0"></path><path id="XMLID_638_" d="M168 34.7c-3 2.9-6.7 4.4-11.1 4.4s-8.1-1.5-11.1-4.4-4.5-6.6-4.5-10.9c0-4.4 1.5-8 4.5-10.9s6.7-4.4 11.1-4.4S165 10 168 12.9s4.5 6.6 4.5 10.9c0 4.4-1.5 8-4.5 10.9m-2.3-10.9c0-2.6-.9-4.9-2.6-6.8s-3.8-2.8-6.3-2.8-4.6.9-6.3 2.8-2.6 4.1-2.6 6.8c0 2.6.9 4.9 2.6 6.8s3.8 2.8 6.3 2.8 4.6-.9 6.3-2.8c1.8-1.9 2.6-4.1 2.6-6.8" class="st0"></path><path id="XMLID_636_" d="M186 31.2q1.65 2.1 4.5 2.1c2.85 0 3.4-.7 4.4-2.1 1.1-1.4 1.6-3.3 1.6-5.6V9.2h6.6v16.6q0 6.45-3.6 9.9c-3.6 3.45-5.4 3.5-9.1 3.5s-6.8-1.2-9.2-3.5q-3.6-3.45-3.6-9.9V9.2h6.6v16.4c.1 2.3.7 4.2 1.8 5.6" class="st0"></path><path id="XMLID_633_" d="M232.7 13c2.8 2.6 4.3 6.2 4.3 10.8s-1.4 8.3-4.1 11c-2.8 2.7-7 4-12.6 4H210V9.1h10.5c5.3 0 9.4 1.3 12.2 3.9m-4.8 17.7c1.6-1.5 2.4-3.8 2.4-6.7s-.8-5.2-2.4-6.7q-2.4-2.4-7.5-2.4h-3.7V33h4.2c3 0 5.3-.8 7-2.3" class="st0"></path><path id="XMLID_631_" d="M274.7 9.1h6.6v29.7h-6.6l-14.2-18.6v18.6h-6.6V9.1h6.2l14.6 19.1z" class="st0"></path><path id="XMLID_628_" d="m309.8 38.8-2.8-6.4h-12.5l-2.8 6.4h-7.1l12.8-29.7h6.4l12.8 29.7zM300.9 18l-3.7 8.6h7.4z" class="st0"></path><path id="XMLID_626_" d="M330.8 14.9v24h-6.6v-24h-8.4V9.2h23.5v5.7z" class="st0"></path><path id="XMLID_624_" d="M344 9.1h6.6v29.7H344z" class="st0"></path><path id="XMLID_622_" d="m368.9 28 7.6-18.9h7.2l-11.9 29.7h-5.6L354.3 9.1h7.2z" class="st0"></path><path id="XMLID_620_" d="M408.6 9.1V15h-14.8v6.1h13.3v5.7h-13.3V33h15.3v5.9h-21.9V9.2h21.4z" class="st0"></path><path id="XMLID_618_" d="M94.6 64.1c1.8 0 3.3-.7 4.5-2.2l2.4 2.5c-1.9 2.1-4.1 3.2-6.7 3.2s-4.7-.8-6.3-2.4c-1.7-1.6-2.5-3.7-2.5-6.1 0-2.5.8-4.5 2.5-6.2s3.8-2.5 6.2-2.5c2.7 0 5 1 6.9 3.1l-2.3 2.6c-1.2-1.5-2.6-2.2-4.4-2.2-1.4 0-2.6.5-3.6 1.4s-1.5 2.1-1.5 3.7.5 2.8 1.4 3.7c.9 1 2.1 1.4 3.4 1.4" class="st0"></path><path id="XMLID_615_" d="M118 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.2-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c.9-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_613_" d="m138.6 56.9-4.5 9.1h-2.2l-4.5-9.1v10.5h-3.7V50.7h5l4.3 9.1 4.3-9.1h5v16.7h-3.7z" class="st0"></path><path id="XMLID_610_" d="M157.9 52.3c1.2 1 1.8 2.5 1.8 4.6s-.6 3.6-1.8 4.5c-1.2 1-3 1.4-5.5 1.4h-2.2v4.6h-3.7V50.7h5.9c2.5.1 4.3.6 5.5 1.6m-2.7 6.5c.4-.5.7-1.2.7-2.2s-.3-1.6-.9-2-1.5-.6-2.7-.6h-2.1v5.6h2.5c1.2 0 2-.3 2.5-.8" class="st0"></path><path id="XMLID_608_" d="M167 63.1c.6.8 1.5 1.2 2.5 1.2s1.9-.4 2.5-1.2.9-1.8.9-3.2v-9.2h3.7V60c0 2.4-.7 4.3-2 5.6s-3 1.9-5.1 1.9-3.8-.7-5.1-2-2-3.2-2-5.6v-9.3h3.7v9.2q0 2.25.9 3.3" class="st0"></path><path id="XMLID_606_" d="M187.5 54v13.4h-3.7V54h-4.7v-3.2h13.2V54z" class="st0"></path><path id="XMLID_604_" d="M195 50.8h3.7v16.7H195z" class="st0"></path><path id="XMLID_602_" d="M214.4 50.8h3.7v16.7h-3.7l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7V50.8z" class="st0"></path><path id="XMLID_600_" d="M233.1 59h3.7v5.9c-1.7 1.8-3.9 2.8-6.9 2.8-2.4 0-4.5-.8-6.2-2.4s-2.5-3.7-2.5-6.1c0-2.5.8-4.5 2.5-6.2s3.7-2.5 6.1-2.5 4.5.8 6.2 2.4l-1.9 2.8c-.7-.7-1.4-1.1-2.1-1.3-.6-.2-1.3-.4-2-.4-1.4 0-2.6.5-3.6 1.4-1 1-1.5 2.2-1.5 3.8s.5 2.8 1.4 3.8c.9.9 2 1.4 3.3 1.4s2.4-.2 3.2-.7V59z" class="st0"></path><path id="XMLID_598_" d="M257.8 50.8v3.3h-7.7v3.6h7.3V61h-7.3v6.5h-3.7V50.8z" class="st0"></path><path id="XMLID_595_" d="M275 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.3-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c1-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_593_" d="M285.1 63.1c.6.8 1.5 1.2 2.5 1.2s1.9-.4 2.5-1.2.9-1.8.9-3.2v-9.2h3.7V60c0 2.4-.7 4.3-2 5.6s-3 1.9-5.1 1.9-3.8-.7-5.1-2-2-3.2-2-5.6v-9.3h3.7v9.2c-.1 1.5.3 2.6.9 3.3" class="st0"></path><path id="XMLID_591_" d="M310.2 50.8h3.7v16.7h-3.7l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7V50.8z" class="st0"></path><path id="XMLID_588_" d="M330.7 53c1.6 1.5 2.4 3.5 2.4 6.1s-.8 4.6-2.3 6.1-3.9 2.3-7.1 2.3H318V50.8h5.9c3 0 5.3.7 6.8 2.2m-2.7 9.9c.9-.9 1.4-2.1 1.4-3.7s-.5-2.9-1.4-3.8-2.3-1.3-4.2-1.3h-2.1v10.1h2.4c1.7-.1 3-.5 3.9-1.3" class="st0"></path><path id="XMLID_585_" d="m347.7 67.4-1.5-3.6h-7l-1.5 3.6h-4l7.2-16.7h3.6l7.2 16.7zm-5-11.7-2.1 4.8h4.2z" class="st0"></path><path id="XMLID_583_" d="M359.5 54v13.4h-3.7V54H351v-3.2h13.2V54z" class="st0"></path><path id="XMLID_581_" d="M366.9 50.8h3.7v16.7h-3.7z" class="st0"></path><path id="XMLID_578_" d="M388.7 65.1c-1.7 1.6-3.8 2.5-6.2 2.5-2.5 0-4.5-.8-6.2-2.5-1.7-1.6-2.5-3.7-2.5-6.1s.8-4.5 2.5-6.1 3.8-2.5 6.2-2.5c2.5 0 4.5.8 6.2 2.5 1.7 1.6 2.5 3.7 2.5 6.1s-.8 4.5-2.5 6.1m-1.2-6.1c0-1.5-.5-2.8-1.4-3.8-1-1-2.1-1.6-3.5-1.6s-2.6.5-3.5 1.6c-1 1-1.4 2.3-1.4 3.8s.5 2.7 1.4 3.8c1 1 2.1 1.6 3.5 1.6s2.6-.5 3.5-1.6c.9-1 1.4-2.3 1.4-3.8" class="st0"></path><path id="XMLID_576_" d="M406 50.8h3.7v16.7H406l-7.9-10.4v10.4h-3.7V50.8h3.5l8.2 10.7z" class="st0"></path></g></g><g id="XMLID_197_"><g id="XMLID_392_"><path id="XMLID_397_" d="M15.5 47.7H6.4v21.4h21.3v-9.2H15.5z" class="st0"></path><path id="XMLID_395_" d="M61.3 47.8v12.1H49.1v-.1 9.3h21.3V47.7h-9.2z" class="st0"></path><path id="XMLID_394_" d="M6.4 26.4h9.2l-.1-.1V14.2h12.2V5H6.4z" class="st0"></path><path id="XMLID_393_" d="M49.1 5v9.2h12.2v12.2h9.1V5z" class="st0"></path></g><g id="XMLID_200_" opacity="0.8"><path id="XMLID_391_" d="M47.9 26.4 35.7 14.2h13.4V5H27.7v9.2l12.2 12.2z" class="st0"></path><path id="XMLID_390_" d="M36.9 47.7h-8L39 57.8l2 2.1H27.7v9.2h21.4v-9.3l-6.1-6z" class="st0"></path><path id="XMLID_389_" d="M61.3 26.4v13.3l-2.1-2.1-10.1-10.1v8.1l6 6 6.1 6.1h9.2V26.4z" class="st0"></path><path id="XMLID_388_" d="M27.7 38.5 15.6 26.4H6.4v21.3h9.1V34.4l12.2 12.2z" class="st0"></path></g></g></svg><div class="footer__copyright">© 2025 OpenFeature is a Cloud Native Computing Foundation incubating project | Documentation Distributed under CC BY 4.0 | All Rights Reserved</div></div></div></footer></div> </body> </html>