blob: 2c3aea186a4e37f6a0b132a13e4a0a5f92c9d139 [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>EJB Refs</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>TomEE complains it doesn&#8217;t know the container type, so I added
type="javax.naming.InitialContext" and it worked (mostly). ##
Referencing a bean in another jar (with annotations)</p>
</div>
<div class="paragraph">
<p>When using annotations to reference a bean from another ejb in your ear
you have to supplement the <code>@EJB</code> reference with a small chunk of xml in
the ejb-jar.xml of the referring bean.</p>
</div>
<div class="paragraph">
<p>So in ejb app A colorsApp.jar you have this bean:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package com.foo.colors;
import javax.ejb.Stateless;
@Stateless
public class OrangeBean implements OrangeRemote {
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then in ejb app B shapesApp.jar you have this bean with a reference to
OrangeRemote:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package com.foo.shapes;
import javax.ejb.Stateless;
import com.foo.colors.OrangeRemote;
@Stateless
public class SquareBean implements SquareRemote {
@EJB OrangeRemote orangeRemote;
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>To hook this reference up you need to override this ref and add more
info in the ejb-jar.xml of shapesApp.jar as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml">&lt;ejb-jar&gt;
&lt;enterprise-beans&gt;
&lt;session&gt;
&lt;ejb-name&gt;SquareBean&lt;/ejb-name&gt;
&lt;ejb-ref&gt;
&lt;ejb-ref-name&gt;com.foo.shapes.SquareBean/orangeRemote&lt;/ejb-ref-name&gt;
&lt;ejb-link&gt;colorsApp.jar#OrangeBean&lt;/ejb-link&gt;
&lt;/ejb-ref&gt;
&lt;/session&gt;
&lt;/enterprise-beans&gt;
&lt;/ejb-jar&gt;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_referencing_a_bean_in_another_jar_xml_only_no_annotations">Referencing a bean in another jar (xml only, no annotations)</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The same basic approach applies and dependency injection is still
possible, however more information must be described in the xml.</p>
</div>
<div class="paragraph">
<p>In ejb app A colorsApp.jar you have this bean:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package com.foo.colors;
import javax.ejb.Stateless;
@Stateless
public class OrangeBean implements OrangeRemote {
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then in ejb app B shapesApp.jar&#8201;&#8212;&#8201;note there is no <code>@EJB</code> annotation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">package com.foo.shapes;
import javax.ejb.Stateless;
import com.foo.colors.OrangeRemote;
@Stateless
public class SquareBean implements SquareRemote {
OrangeRemote orangeRemote;
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here&#8217;s how you would hook this reference up, injection and all, with
just xml. The following would be added to the ejb-jar.xml of
shapesApp.jar:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml">&lt;ejb-jar&gt;
&lt;enterprise-beans&gt;
&lt;session&gt;
&lt;ejb-name&gt;SquareBean&lt;/ejb-name&gt;
&lt;ejb-ref&gt;
&lt;ejb-ref-name&gt;com.foo.shapes.SquareBean/orangeRemote&lt;/ejb-ref-name&gt;
&lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt;
&lt;remote&gt;com.foo.colors.OrangeRemote&lt;/remote&gt;
&lt;ejb-link&gt;colorsApp.jar#OrangeBean&lt;/ejb-link&gt;
&lt;injection-target&gt;
&lt;injection-target-class&gt;com.foo.shapes.SquareBean&lt;/injection-target-class&gt;
&lt;injection-target-name&gt;orangeRemote&lt;/injection-target-name&gt;
&lt;/injection-target&gt;
&lt;/ejb-ref&gt;
&lt;/session&gt;
&lt;/enterprise-beans&gt;
&lt;/ejb-jar&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Note that the value of could actually be anything and the above example
would still work as there is no annotation that needs to match the and
no one will likely be looking up the EJB as it&#8217;s injected.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_referencing_a_bean_in_another_server">Referencing a bean in another server</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As of OpenEJB 4.0.0-beta-3, server to server references work.</p>
</div>
<div class="paragraph">
<p>First we need to configure and name the InitialContext that will be used
to satisfy the lookup to the other server.</p>
</div>
<div class="paragraph">
<p>In this example we are calling our InitialContext <code>shoe</code> for fun.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;openejb&gt;
&lt;JndiProvider id="shoe" type="javax.naming.InitialContext"&gt;
java.naming.provider.url = ejbd://localhost:4201
java.naming.factory.initial = org.apache.openejb.client.RemoteInitialContextFactory
&lt;/JndiProvider&gt;
&lt;/openejb&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Declaring the <code>@EJB</code> reference is then done using a <code>mappedName</code> that
references the named <code>InitialContext</code></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public class BlueBean implements BlueRemote {
@EJB(mappedName = "jndi:ext://shoe/OrangeBeanRemote")
private OrangeRemote orangeRemote;
public void hasOrangeRemote() {
Assert.assertNotNull("orangeRemote is null", orangeRemote);
assertEquals("olleh", orangeRemote.echo("hello"));
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Specifically, the <code>mappedName</code> syntax is as follows:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>jndi:ext://<code>&lt;contextId&gt;</code>/<code>&lt;jndiName&gt;</code></p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="_referencing_a_bean_in_many_servers">Referencing a bean in "many" servers</h3>
<div class="paragraph">
<p>Note the above also works with the various forms of failover that TomEE
supports.</p>
</div>
<div class="paragraph">
<p>If say, there are two servers that have the <code>OrangeBeanRemote</code> bean, you
could expand the <code>&lt;JndiProvider&gt;</code> delcaration like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-xml" data-lang="xml"> &lt;JndiProvider id="shoe" type="javax.naming.InitialContext"&gt;
java.naming.provider.url = failover:ejbd://192.168.1.20:4201,ejbd://192.168.1.30:4201
java.naming.factory.initial = org.apache.openejb.client.RemoteInitialContextFactory
&lt;/JndiProvider&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the event that the <code>ejbd://192.168.1.20:4201</code> server cannot be
contacted, the second server will be tried.</p>
</div>
<div class="paragraph">
<p>This sort of arangement can also happen dynamicall against a list of
servers that continuously grows and shrinks. The server list is
maintained behind the scenes using server discovery logic that can
function on either UDP or TCP. See these docs for more details on
Failover and Discovery:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="multicast-discovery.html">Multicast Discovery (UDP)</a></p>
</li>
<li>
<p><a href="multipulse-discovery.html">Multipulse Discovery (TCP)</a></p>
</li>
<li>
<p><a href="multipoint-discovery.html">Multipoint Discovery (TCP)</a></p>
</li>
</ul>
</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>