blob: 80d31fa5e3b12a489a38243db582a04b46c2d4b4 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../favicon.ico">
<link rel="icon" type="image/png" href="../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../css/cardio.css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="preloader">
<img src="../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<span>
<img src="../../img/logo-active.png">
</span>
Apache TomEE
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../docs.html">Documentation</a></li>
<li><a href="../../community/index.html">Community</a></li>
<li><a href="../../security/security.html">Security</a></li>
<li><a href="../../download-ng.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>Service Locator</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>The functionality of the
<a href="jndi-names.html">openejb.jndiname.format</a> allows for writing some
really fun service locator code. Creating the exact layout you want
using the exact data you want means you can create robust libraries for
pulling things out of JNDI.</p>
</div>
</div>
</div>
<h1 id="_lookup_examples" class="sect0">Lookup examples</h1>
<div class="paragraph">
<p>To get the creative juices flowing here are a few examples of lookup
methods you could create for your service locator, the jndi name formats
that would work with those lookups, and examples of client code using
the service locator. For simplicity, we&#8217;ll assume all the lookup
examples start with this basic class that has a built-in lookup allowing
for a common prefix to be optionally applied to the beginning of all
lookup strings.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public class MyLocator {
private final Context context;
public MyLocator() throws NamingException {
this(null);
}
public MyLocator(String commonPrefix) throws NamingException {
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
properties.put(Context.PROVIDER_URL, "ejbd://localhost:4201/");
this.context = new InitialContext(properties);
}
public Object lookup(String name) {
try {
if (commonPrefix != null) name = commonPrefix + "/" +name;
return context.lookup(name);
} catch (NamingException e) {
throw new IllegalArgumentException(e);
}
}
}</code></pre>
</div>
</div>
<div class="sect1">
<h2 id="_just_the_interface_usable_with_jndi_name_formats_ending_in_the_full">Just the interface Usable with JNDI name formats ending in the full</h2>
<div class="sectionbody">
<div class="paragraph">
<p>class name of the interface such as: - {interfaceClass}</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public &lt;T&gt; T lookup(Class&lt;T&gt; type) {
return (T) lookup(type.getName());
}
MyLocator locator = new MyLocator();
Widget widget = locator.lookup(Widget.class);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Or with a common prefix or with a common prefix supplied in constructor
such as: - {moduleId}/{interfaceClass} -
ejb/{moduleId}/{interfaceClass}</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">MyLocator locator = new MyLocator("ejb/superbiz");
Widget widget = locator.lookup(Widget.class);
Store store = locator.lookup(Store.class);</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_interface_class_and_a_prefix">Interface class and a prefix</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Usable with JNDI name formats including a varying prefix such as ejbName
or deploymentID and ending in the full class name of the interface</p>
</div>
<div class="ulist">
<ul>
<li>
<p>{ejbName}/{interfaceClass}</p>
</li>
<li>
<p>{deploymentId}/{interfaceClass}</p>
<div class="paragraph">
<p>public T lookup(String prefix, Class type) \{ return (T) lookup(prefix<br>
"/" + type.getName()); }</p>
</div>
<div class="paragraph">
<p>MyLocator locator = new MyLocator(); Widget redWidget =
locator.lookup("RedWidgetBean", Widget.class);<br>
Widget blueWidget = locator.lookup("BlueWidgetBean", Widget.class);</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Or with a common prefix or with a common prefix supplied in constructor
such as: - {moduleId}/{ejbName}/{interfaceClass} -
ejb/{moduleId}/{deploymentId}/{interfaceClass}</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">MyLocator locator = new MyLocator("accountingApp");
Widget widget = locator.lookup("RedWidgetBean", Widget.class);
Store store = locator.lookup("StoreBean", Store.class);</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_interface_class_and_ejb_class">Interface class and ejb class</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Usable with JNDI name formats comprised of the interfaceClass and
ejbClass</p>
</div>
<div class="paragraph">
<p>For variation, the interface class is the prefix and the ejb class is
the suffix. This is neat as the the prefix (the interface class name)
becomes a jndi context with one binding in it for each implementing ejb
class.</p>
</div>
<div class="paragraph">
<p>Works with: - {interfaceClass}/{ejbClass}</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public &lt;T&gt; T lookup(Class&lt;T&gt; type, Class ejbClass) {
return (T) lookup(type.getName() + "/" + ejbClass.getName());
}
MyLocator locator = new MyLocator();
Widget widget = locator.lookup(Widget.class, BlueWidgetBean.class);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Or with a common prefix or with a common prefix supplied in constructor
such as: - {moduleId}/{interfaceClass}/{ejbClass} -
ejb/{moduleId}/{interfaceClass}/{ejbClass}</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">MyLocator locator = new MyLocator("ejb/purchasingApp");
Widget widget = locator.lookup(Widget.class, RedWidgetBean.class);
Store store = locator.lookup(Store.class, StoreBean.class);</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_interface_class_and_ejb_class_with_simple_names">Interface class and ejb class with simple names</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Similar to the above example but using the simple name of the classes
resulting in a JNDI tree that&#8217;s a bit more human readable. -
\{ejbClass.simpleName}/\{interfaceClass.simpleName}</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public &lt;T&gt; T lookup(Class ejbClass, Class&lt;T&gt; type) {
return (T) lookup(ejbClass.getSimpleName() + "" + type.getSimpleName());
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>and</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">MyLocator locator = new MyLocator();
Widget widget = locator.lookup(RedWidgetBean.class, Widget.class);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Or with a common prefix or with a common prefix supplied in constructor
such as: -
{moduleId}/\{ejbClass.simpleName}/\{interfaceClass.simpleName} -
ejb/{moduleId}/\{ejbClass.simpleName}/\{interfaceClass.simpleName}</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">MyLocator locator = new MyLocator("shippingApp");
Widget widget = locator.lookup(GreenWidgetBean.class, Widget.class);
Store store = locator.lookup(SuperStoreBean.class, Store.class);</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
<li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li>
</ul>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/docs/documentation.html" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../js/jquery-1.11.1.min.js"></script>
<script src="../../js/owl.carousel.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script src="../../js/wow.min.js"></script>
<script src="../../js/typewriter.js"></script>
<script src="../../js/jquery.onepagenav.js"></script>
<script src="../../js/tree.jquery.js"></script>
<script src="../../js/highlight.pack.js"></script>
<script src="../../js/main.js"></script>
</body>
</html>