blob: c4b5fa93d9b07d824b899ee1843f66ccde886485 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>OpenEJB 3.1.1</title>
<meta name="description" content="Apache TomEE">
<meta name="author" content="Apache TomEE">
<meta name="google-translate-customization" content="f36a520c08f4c9-0a04e86a9c075ce9-g265f3196f697cf8f-10">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- Le styles -->
<link href="./../resources/css/bootstrap.css" rel="stylesheet">
<link href="./../resources/css/prettify.css" rel="stylesheet">
<!--link href="./../resources/css/bootstrap-mods.css" rel="stylesheet"-->
<link href="./../resources/css/main.css" rel="stylesheet">
<link href="./../resources/font-awesome-4.6.3/css/font-awesome.min.css" rel="stylesheet">
<script type="text/javascript">
var t = encodeURIComponent(document.title.replace(/^\s+|\s+$/g,""));
var u = encodeURIComponent(""+document.URL);
function fbshare () {
window.open(
"http://www.facebook.com/sharer/sharer.php?u="+u,
'Share on Facebook',
'width=640,height=426');
};
function gpshare () {
window.open(
"https://plus.google.com/share?url="+u,
'Share on Google+',
'width=584,height=385');
};
function twshare () {
window.open(
"https://twitter.com/intent/tweet?url="+u+"&text="+t,
'Share on Twitter',
'width=800,height=526');
};
function pinshare () {
window.open("//www.pinterest.com/pin/create/button/?url="+u+"&media=http%3A%2F%2Ftomee.apache.org%2Fresources%2Fimages%2Ffeather-logo.png&description="+t,
'Share on Pinterest',
'width=800,height=526');
};
</script>
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="./../favicon.ico">
<link rel="apple-touch-icon" href="./../resources/images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="72x72" href="./../resources/images/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="114x114" href="./../resources/images/apple-touch-icon-114x114.png">
<script src="./../resources/js/prettify.js" type="text/javascript"></script>
<script src="./../resources/js/jquery-latest.js"></script>
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
<script src="./../resources/js/common.js"></script>
<script src="./../resources/js/prettyprint.js"></script>
<!--script src="//assets.pinterest.com/js/pinit.js" type="text/javascript" async></script//-->
<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="topbar" data-dropdown="dropdown">
<div class="fill">
<div class="container">
<a class="brand" href="./../index.html">Apache TomEE</a>
<ul class="nav">
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
Apache
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<!-- <li><a href="./../misc/whoweare.html">Who we are?</a></li> -->
<!-- <li><a href="./../misc/heritage.html">Heritage</a></li> -->
<li><a href="http://www.apache.org">Apache Home</a></li>
<!-- <li><a href="./../misc/resources.html">Resources</a></li> -->
<li><a href="./../misc/contact.html">Contact</a></li>
<li><a href="./../misc/legal.html">Legal</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
<li class="divider"/>
<li><a href="http://www.apache.org/security">Security</a></li>
</ul>
</li>
<li><a href="./../index.html">Home</a></li>
<li><a href="./../downloads.html">Downloads</a></li>
<li><a href="./../documentation.html">Documentation</a></li>
<li><a href="./../examples-trunk/index.html">Examples</a></li>
<li><a href="./../support.html">Support</a></li>
<li><a href="./../contribute.html">Contribute</a></li>
<li><a href="./../security/index.html">Security</a></li>
</ul>
<!-- Google CSE Search Box Begins -->
<FORM class="pull-right" id="searchbox_010475492895890475512:_t4iqjrgx90" action="http://www.google.com/cse">
<INPUT type="hidden" name="cx" value="010475492895890475512:_t4iqjrgx90">
<INPUT type="hidden" name="cof" value="FORID:0">
<INPUT size="18" width="130" style="width:130px" name="q" type="text" placeholder="Search">
</FORM>
<!--<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_010475492895890475512:_t4iqjrgx90"></SCRIPT>-->
<!-- Google CSE Search Box Ends -->
</div>
</div>
</div>
<div class="container">
<div class="page-header">
<small><a href="./../index.html">Home</a>&nbsp;&raquo&nbsp;<a href="./../download/">Download</a></small><br>
<h1>OpenEJB 3.1.1
<div style="float: right; position: relative; bottom: -10px; ">
<a onclick="javascript:gpshare()" class="gp-share sprite" title="Share on Google+">share [gp]</a>
<a onclick="javascript:fbshare()" class="fb-share sprite" title="Share on Facebook">share [fb]</a>
<a onclick="javascript:twshare()" class="tw-share sprite" title="Share on Twitter">share [tw]</a>
<a onclick="javascript:pinshare()" class="pin-share sprite" title="Share on Pinterest">share [pin]</a>
<a data-toggle="modal" href="#edit" class="edit-page" title="Contribute to this Page">contribute</a>
</div>
</h1>
</div>
<ul>
<li>Release Date: June 2nd, 2009</li>
<li>Partial EJB 3.1 support</li>
<li>EJB 3.0 support</li>
<li>EJB 2.1 support</li>
<li>EJB 2.0 support</li>
<li>EJB 1.1 support</li>
</ul>
<p><a name="OpenEJB3.1.1-Download"></a></p>
<h1>Download</h1>
<p><a name="OpenEJB3.1.1-OpenEJBStandloneServer"></a></p>
<h4>OpenEJB Standlone Server</h4>
<ul>
<li><a href="http://archive.apache.org/dist/openejb/3.1.1/openejb-3.1.1.zip">openejb-3.1.1.zip</a>
([pgp|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1.zip.asc], [md5|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1.zip.md5]
) </li>
<li><a href="http://archive.apache.org/dist/openejb/3.1.1/openejb-3.1.1.tar.gz">openejb-3.1.1.tar.gz</a>
([pgp|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1.tar.gz.asc], [md5|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1.tar.gz.md5]
) </li>
</ul>
<p><a name="OpenEJB3.1.1-OpenEJBforTomcat"></a></p>
<h4>OpenEJB for Tomcat</h4>
<ul>
<li><a href="http://archive.apache.org/dist/openejb/3.1.1/openejb.war">openejb.war</a>
([pgp|http://www.apache.org/dist/openejb/3.1.1/openejb.war.asc], [md5|http://www.apache.org/dist/openejb/3.1.1/openejb.war.md5]
) </li>
</ul>
<p><a name="OpenEJB3.1.1-EJB3.1andotherexamples(sourceincluded)"></a></p>
<h4>EJB 3.1 and other examples (source included)</h4>
<ul>
<li><a href="http://archive.apache.org/dist/openejb/3.1.1/openejb-examples-3.1.1.tar.gz">openejb-examples-3.1.1.tar.gz</a></li>
</ul>
<p>([pgp|http://www.apache.org/dist/openejb/3.1.1/openejb-examples-3.1.1.tar.gz.asc], [md5|http://www.apache.org/dist/openejb/3.1.1/openejb-examples-3.1.1.tar.gz.md5]
)
* <a href="http://archive.apache.org/dist/openejb/3.1.1/openejb-examples-3.1.1.zip">openejb-examples-3.1.1.zip</a></p>
<p>([pgp|http://www.apache.org/dist/openejb/3.1.1/openejb-examples-3.1.1.zip.asc], [md5|http://www.apache.org/dist/openejb/3.1.1/openejb-examples-3.1.1.zip.md5]
) </p>
<p><a name="OpenEJB3.1.1-SourceCode"></a></p>
<h4>Source Code</h4>
<ul>
<li><a href="http://archive.apache.org/dist/openejb/3.1.1/openejb-3.1.1-src.zip">openejb-3.1.1-src.zip</a>
([pgp|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1-src.zip.asc], [md5|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1-src.zip.md5]
) </li>
<li><a href="http://archive.apache.org/dist/openejb/3.1.1/openejb-3.1.1-src.tar.gz">openejb-3.1.1-src.tar.gz</a></li>
</ul>
<p>([pgp|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1-src.tar.gz.asc], [md5|http://www.apache.org/dist/openejb/3.1.1/openejb-3.1.1-src.tar.gz.md5]
) </p>
<p><a name="OpenEJB3.1.1-ReleaseNotes"></a></p>
<h4>Release Notes</h4>
<ul>
<li><a href="http://www.apache.org/dist/openejb/3.1.1/RELEASE-NOTES.txt">RELEASE-NOTES.txt</a></li>
</ul>
<p><a name="OpenEJB3.1.1-TestedOn"></a></p>
<h1>Tested On</h1>
<table>
<tr><th> </th><th> Windows XP (JDK 1.5) </th><th> Windows XP (JDK 1.6) </th><th> Linux (JDK 1.5) </th><th>
Linux (JDK 1.6) </th><th> Mac OSX (JDK 1.5) </th><th> Mac OSX (JDK 1.6) </th></tr>
<tr><td> Embedded </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Standalone </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 6.0.14 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 6.0.13 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 6.0.10 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 6.0.9 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 5.5.26 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 5.5.25 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 5.5.23 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
<tr><td> Tomcat 5.5.20 </td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td><td><IMG class="emoticon" src="http://tomee.apache.org/resources/images/check.png" height="16" width="16" align="absmiddle" alt="" border="0"></td></tr>
</table>
<p><a name="OpenEJB3.1.1-ChangeSummary"></a></p>
<h1>Change Summary</h1>
<p>Major new features:
* TestCase Dependency Injection via @LocalClient
* Support for exposing a single interface as @WebService, @Remote, and
@Local
* Support for alternate deployment descriptors for testing and other
environments</p>
<p>Significant Improvements:</p>
<ul>
<li>Global "openejb:" jndi namespace</li>
<li>Ability to use mappedName as a JNDI Name format</li>
<li>Web service endpoints securable</li>
<li>@EjbDeployment annotation as alternative to <ejb-deployment> in
openejb-jar.xml</li>
<li>All openejb.* options and values logged on debug</li>
</ul>
<p><a name="OpenEJB3.1.1-EJB3.1Features"></a></p>
<h1>EJB 3.1 Features</h1>
<p><a name="OpenEJB3.1.1-EJB3.1Singletons"></a></p>
<h2>EJB 3.1 Singletons</h2>
<p>Singletons are a new type of Session bean being added to the EJB 3.1
specification. As the name implies a javax.ejb.Singleton is a session bean
with a guarantee that there is at most one instance in the application.</p>
<p>Singletons gives you some important things that are missing in EJB 3.0 and
prior versions, such as the ability to have an EJB that is notified when
the application starts and notified when the application stops, allowing
you to do all sorts of things that previously could only be done with a
load-on-startup servlet. Singletons also give provide a great place to
hold data that pertains to the entire application and all users using it,
without the need for a static. Additionally, Singleton beans have
multi-threaded capabilities allowing them to be invoked by several threads
at one time similar to a Servlet.</p>
<p>See the <a href="openejbx30:singleton-beans.html">Singleton API</a>
and [Singleton Example]
pages.</p>
<p><a name="OpenEJB3.1.1-EmbeddableforTestingandJavaSEusage(proposedEJB3.1feature)"></a></p>
<h2>Embeddable for Testing and Java SE usage (proposed EJB 3.1 feature)</h2>
<p>Over the years, OpenEJB has innovated the art of the embedded/Java SE EJB
container usable as a plain library much the way an embedded databases
work. In a simple 1, 2, 3 step of 1) add OpenEJB to your classpath, 2) add
a META-INF/ejb-jar.xml containing at minimum "<ejb-jar/>", then 3) use the
org.apache.openejb.client.LocalInitialContextFactory when creating your
client InitialContext, you've got a Java SE EJB container that can be used
in unit tests, your IDE, or anywhere you'd like to drop in EJB
functionality. Configuration can be done through an openejb.xml file or
can be encapsulated 100% in the test case through the parameters passed to
the InitialContext. For example, to create a JTA DataSource for JPA usage,
you can simply:</p>
<pre><code>Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
p.put("movieDatabase", "new://Resource?type=DataSource");
p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
Context context = new InitialContext(p);
</code></pre>
<p>See the examples zip for a dozen embedded testing examples that range from
simple @Stateless beans to advanced transaction and security testing.</p>
<p><a name="OpenEJB3.1.1-CollapsedEAR(EJBsin.WARs)(proposedEJB3.1feature)"></a></p>
<h2>Collapsed EAR (EJBs in .WARs) (proposed EJB 3.1 feature)</h2>
<p>Along the lines of the Tomcat integration where OpenEJB can be plugged into
Tomcat, we've expanded the idea to also allow your EJBs to be plugged into
your webapp. We call this innovative feature <a href="collapsed-ear.html">Collapsed EAR</a>
. In this style 100% of your classes, including your EJBs, can be packed
into your WEB-INF/classes and WEB-INF/lib directories. The result is that
your WAR file becomes a replacement for an EAR. Unlike an EAR, all
multi-packaging and multi-classloader requirements are stripped away and
collapsed down to one archive and one classloader all your components, EJBs
or otherwise, can share.</p>
<p><a name="OpenEJB3.1.1-ConstructorInjection(proposedEJB3.1feature)"></a></p>
<h2>Constructor Injection (proposed EJB 3.1 feature)</h2>
<p>For those of you who would like to use final fields, wish to avoid numerous
setters, or dislike private field injection and would like nothing more
than to just use plan old java constructors, your wish has come true. This
is a feature we intended to add to OpenEJB 3.0 but didn't have time for.
We're happy to bring it to the OpenEJB 3.1.1 release and with a bit of luck
and support from people like yourself, we'll see this as an EJB 3.1 feature
as well.</p>
<pre><code>@Stateless
public class WidgetBean implements Widget {
@EJB(beanName = "FooBean")
private final Foo foo;
@Resource(name = "count")
private final int count;
@Resource
private final DataSource ds;
public WidgetBean(Integer count, Foo foo, DataSource ds) {
this.count = count;
this.foo = foo;
this.ds = ds;
}
public int getCount() {
return count;
}
public Foo getFoo() {
return foo;
}
}
</code></pre>
<p><a name="OpenEJB3.1.1-GeneralFeatures"></a></p>
<h1>General Features</h1>
<p><a name="OpenEJB3.1.1-EJB3.0Support"></a></p>
<h2>EJB 3.0 Support</h2>
<p>OpenEJB 3.1.1 supports the EJB 3.0 specification as well as the prior EJB
2.1, EJB 2.0, and EJB 1.1. New features in EJB 3.0 include:</p>
<ul>
<li>Annotations instead of xml</li>
<li>No home interfaces</li>
<li>Business Interfaces</li>
<li>Dependency Injection</li>
<li>Interceptors</li>
<li>Java Persistence API</li>
<li>Service Locator (ala SessionContext.lookup)</li>
<li>POJO-style beans</li>
<li>JAX-WS Web Services</li>
</ul>
<p>EJB 2.x features since OpenEJB 1.0 also include:
- MessageDriven Beans
- Container-Managed Persistence (CMP) 2.0
- Timers</p>
<p>The two aspects of EJB that OpenEJB does not yet support are:
- JAX-RPC
- CORBA</p>
<p>CORBA support will be added in future releases. Support for the JAX-RPC
API is not a planned feature.</p>
<p><a name="OpenEJB3.1.1-EJBPluginforTomcat6and5.5"></a></p>
<h2>EJB Plugin for Tomcat 6 and 5.5</h2>
<p>OpenEJB 3.1.1 can be <a href="openejbx30:tomcat.html">plugged into</a>
any Tomcat 6 or Tomcat 5.5 server, adding support for EJBs in Web Apps.
War files themselves can contain EJBs and the Servlets can use new JavaEE 5
annotations, XA transactions, JPA, and JMS. Webapps can even support fat
java clients connecting over HTTP.</p>
<p>Don't use EJBs? </p>
<p>No matter, adding OpenEJB to Tomcat gives Servlets several new Java EE 5
capabilities such as JPA, JAX-WS, JMS, J2EE Connectors, transactions, and
more as well as enhancing the injection features of Tomcat 6 to now support
injection of JavaEE objects like Topics, Queues, EntityManagers, JMS
ConnectionFactories, JavaMail Sessions, as well as simpler data types such
as Dates, Classes, URI, URL, List, Map, Set, Properties, and more. In the
case of Tomcat 5.5 which doesn't support dependency injection at all, even
more is gained.</p>
<p><a name="OpenEJB3.1.1-SpringIntegration"></a></p>
<h2>Spring Integration</h2>
<p>Add OpenEJB 3.1.1 to your Spring application to gain the ability for EJBs
to be easily injected into Spring beans (and vice versa) and add Java EE 5
capabilities such as JPA, JAX-WS, JMS, J2EE Connectors, transactions, and
security.</p>
<p>See the <a href="openejbx30:spring.html">Spring</a>
page and [Spring Example|OPENEJBx30:Spring EJB and JPA]
for an example.</p>
<p><a name="OpenEJB3.1.1-MulticastDiscovery"></a></p>
<h2>Multicast Discovery</h2>
<p>Add the <a href="http://people.apache.org/repo/m2-ibiblio-rsync-repository/org/apache/openejb/openejb-multicast/3.1/openejb-multicast-3.1.jar">openejb-multicast.jar</a>
to your OpenEJB distributions lib/ directory and gain the ability to use
multicast discovery between clients and serves as well as between servers
allowing for request failover to other discovered servers. Clients can
discover and access servers with a new "multicast://239.255.3.2:6142" url
as follows:</p>
<pre><code>Properties p = new Properties();
p.put("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory");
p.put("java.naming.provider.url", "multicast://239.255.3.2:6142");
InitialContext ctx = new InitialContext(p);
</code></pre>
<p><a name="OpenEJB3.1.1-RunsonOSGi"></a></p>
<h2>Runs on OSGi</h2>
<p>All OpenEJB 3.1.1 binaries come with complete OSGi metadata and are usable
as a bundle in any OSGi platform. Look for OpenEJB in the upcoming,
OSGi-based ServiceMix 4 which is built on Apache Felix.</p>
<p><a name="OpenEJB3.1.1-CMPviaJPA"></a></p>
<h2>CMP via JPA</h2>
<p>Our CMP implementation is a thin layer over the new Java Persistence API
(JPA). This means when you deploy an old style CMP 1.1 or CMP 2.1 bean it
is internally converted and ran as a JPA bean. This makes it possible to
use both CMP and JPA in the same application without any coherence issues
that can come from using two competing persistence technologies against the
same data. Everything is ultimately JPA in the end.</p>
<p><a name="OpenEJB3.1.1-DependencyInjection--Enums,Classes,Dates,Files,ohmy."></a></p>
<h2>Dependency Injection -- Enums, Classes, Dates, Files, oh my.</h2>
<p>Dependency Injection in EJB 3.0 via @Resource is largely limited to objects
provided by the container, such as DataSources, JMS Topics and Queues. It
is possible for you to supply your own configuration information for
injection, but standard rules allow for only data of type String,
Character, Boolean, Integer, Short, Long, Double, Float and Byte. If you
needed a URL, for example, you'd have to have it injected as a String then
convert it yourself to a URL. This is just plain silly as the conversion
of Strings to other basic data types has existed in JavaBeans long before
Enterprise JavaBeans existed.</p>
<p>OpenEJB 3.1.1 supports injection of any data type for which you can supply
a JavaBeans PropertyEditor. We include several built-in PropertyEditors
already such as Date, InetAddress, Class, File, URL, URI, Map, List, any
java.lang.Enum and more.</p>
<pre><code>import java.net.URI;
import java.io.File;
import java.util.Date;
@Stateful
public class MyBean {
@Resource URI blog;
@Resource Date birthday;
@Resource File homeDirectory;
}
</code></pre>
<p><a name="OpenEJB3.1.1-DependencyInjection--GenericCollectionsandMaps"></a></p>
<h2>Dependency Injection -- Generic Collections and Maps</h2>
<p>Support for Java Generics makes the dependency injection that much more
powerful. Declare an injectable field that leverages Java Generics and we
will use that information to boost your injection to the next level. For
example:</p>
<pre><code>import java.net.URI;
import java.io.File;
@Stateful
public class MyBean {
@Resource List&lt;Class&gt; factories;
@Resource Map&lt;URI, File&gt; locations;
}
</code></pre>
<p><a name="OpenEJB3.1.1-DependencyInjection--CustomTypes"></a></p>
<h2>Dependency Injection -- Custom Types</h2>
<p>You can easily add your own types or override the way built-in types are
handled and claim dependency injection as your own making it a critical
part of your architecture. For example, let's register a custom editor for
our Pickup enum.</p>
<pre><code>import java.beans.PropertyEditorManager;
public enum Pickup {
HUMBUCKER,
SINGLE_COIL;
// Here's the little magic where we register the PickupEditor
// which knows how to create this object from a string.
// You can add any of your own Property Editors in the same way.
static {
PropertyEditorManager.registerEditor(Pickup.class, PickupEditor.class);
}
}
</code></pre>
<p>And referenced as follows</p>
<pre><code>@Stateful
public class StratocasterImpl implements Stratocaster {
@Resource(name = "pickups")
private List&lt;Pickup&gt; pickups;
}
</code></pre>
<p><a name="OpenEJB3.1.1-TheMETA-INF/env-entries.properties"></a></p>
<h2>The META-INF/env-entries.properties</h2>
<p>Along the lines of injection, one of the last remaining things in EJB 3
that people need an ejb-jar.xml file for is to supply the value of
env-entries. Env Entries are the source of data for all user supplied data
injected into your bean; the afore mentioned String, Boolean, Integer, etc.
This is a very big burden as each env-entry is going to cost you 5 lines
of xml and the complication of having to figure out how to add you bean
declaration in xml as an override of an existing bean and not accidentally
as a new bean. All this can be very painful when all you want is to supply
the value of a few @Resource String fields in you bean class. </p>
<p>To fix this, OpenEJB supports the idea of a META-INF/env-entries.properties
file where we will look for the value of things that need injection that
are not container controlled resources (i.e. datasources and things of that
nature). You can configure you ejbs via a properties file and skip the
need for an ejb-jar.xml and it's 5 lines per property madness.</p>
<p>META-INF/env-entries.properties</p>
<pre><code>blog = http://acme.org/myblog
birthday = 1954-03-01
homeDirectory = /home/esmith/
</code></pre>
<p><a name="OpenEJB3.1.1-SupportforGlassFishdescriptors"></a></p>
<h2>Support for GlassFish descriptors</h2>
<p>Unit testing EJBs with OpenEJB is a major feature and draw for people, even
for people who may still use other app servers for final deployment such as
Geronimo or GlassFish. The descriptor format for Geronimo is natively
understood by OpenEJB as OpenEJB is the EJB Container provider for
Geronimo. However, OpenEJB also supports the GlassFish descriptors so
people using GlassFish as their final server can still use OpenEJB for
testing EJBs via plain JUnit tests in their build and only have one set of
vendor descriptors to maintain.</p>
<p><a name="OpenEJB3.1.1-JavaEE5EARandApplicationClientsupport"></a></p>
<h2>JavaEE 5 EAR and Application Client support</h2>
<p>JavaEE 5 EARs, RARs, and Application Clients can be deployed in addition to
ejb jars. EAR support is limited to ejbs, application clients, RARs, and
libraries; WAR files will be ignored unless embedded in Tomcat. Per the
JavaEE 5 spec, the META-INF/application.xml and
META-INF/application-client.xml files are optional.</p>
<p><a name="OpenEJB3.1.1-ApplicationValidationforEJB3.0"></a></p>
<h2>Application Validation for EJB 3.0</h2>
<p>Incorrect usage of various new aspects of EJB 3.0 are checked for and
reported during the deployment process preventing strange errors and
failures.</p>
<p>As usual validation failures (non-compliant issues with your application)
are printed out in complier-style "all-at-once" output allowing you to see
and fix all your issues in one go. For example, if you have 10
@PersistenceContext annotations that reference an invalid persistence unit,
you get all 10 errors on the <em>first</em> deploy rather than one failure on the
first deploy with 9 more failed deployments to go.</p>
<p>Validation output comes in three levels. The most verbose level will tell
you in detail what you did wrong, what the options are, and what to do
next... even including valid code and annotation usage tailored to your app
that you can copy and paste into your application. Very ideal for
beginners and people using OpenEJB in a classroom setting.</p>
<p>Some example output might look like the following. Here we illegally add
some annotations to the "Movies" bean's interface as well as use the wrong
annotations for various types of injection:</p>
<pre><code>FAIL ... Movies: @Stateful cannot be applied to an interface: org.superbiz.injection.jpa.Movies
FAIL ... Movies: Missing required "type" attribute on class-level @Resource usage
FAIL ... Movies: Mistaken use of @Resource on an EntityManagerFactory reference.
Use @PersistenceUnit for ref "org.superbiz.injection.jpa.MoviesImpl/entityManagerFactory"
FAIL ... Movies: Mistaken use of @PersistenceUnit on an EntityManager reference.
Use @PersistenceContext for ref "org.superbiz.injection.jpa.MoviesImpl/entityManager"
WARN ... Movies: Inoring @RolesAllowed used on interface org.superbiz.injection.jpa.Movies method deleteMovie.
Annotation only usable on the bean class.
WARN ... Movies: Ignoring @TransactionAttribute used on interface org.superbiz.injection.jpa.Movies method addMovie.
Annotation only usable on the bean class.
</code></pre>
<h2>JNDI Name Formatting</h2>
<p>A complication when using EJB is that plain client applications are at the
mercy of vendor's chosen methodology for how JNDI names should be
constructed. OpenEJB breaks the mold by allowing you to [specify the exact format|OPENEJBx30:JNDI Names]
you'd like OpenEJB to use for your server or any individual application.
Supply us with a formatting string, such as
"ejb/{ejbName}/{interfaceClass.simpleName}", to get a JNDI layout that
best matches your needs.</p>
<h1>Changelog</h1>
<pre><code>{swizzlejira}
#set ( $jira =
</code></pre>
<p>$rss.fetch("http://issues.apache.org/jira/secure/IssueNavigator.jspa?view=rss&amp;&amp;pid=12310530&amp;status=5&amp;status=6&amp;fixfor=12313484&amp;tempMax=1000&amp;reset=true&amp;decorator=none")
)
#set( $issues = $jira.issues )</p>
<h3>New Features:</h3>
<pre><code>{swizzlejiraissues:issues=$as.param($issues.equals("type", "New
</code></pre>
<p>Feature").descending("id"))|columns=key;summary}</p>
<h3>Improvements:</h3>
<pre><code>{swizzlejiraissues:issues=$as.param($issues.equals("type",
</code></pre>
<p>"Improvement"))|columns=key;summary}</p>
<h3>Tasks &amp; Sub-Tasks:</h3>
<pre><code>{swizzlejiraissues:issues=$as.param($issues.matches("type",
</code></pre>
<p>"Task|Sub-task").sort("summary"))|columns=key;summary}</p>
<pre><code>{swizzlejira}
</code></pre>
<div id="edit" class="modal hide fade in" style="display: none; ">
<div class="modal-header">
<a class="close" data-dismiss="modal">x</a>
<h3>Thank you for contributing to the documentation!</h3>
</div>
<div class="modal-body">
<h4>Any help with the documentation is greatly appreciated.</h4>
<p>All edits are reviewed before going live, so feel free to do much more than fix typos or links. If you see a page that could benefit from an entire rewrite, we'd be thrilled to review it. Don't be surprised if we like it so much we ask you for help with other pages :)</p>
<small>NOTICE: unless indicated otherwise on the pages in question, all editable content available from apache.org is presumed to be licensed under the Apache License (AL) version 2.0 and hence all submissions to apache.org treated as formal Contributions under the license terms.</small>
<!--[if gt IE 6]>
<h4>Internet Explorer Users</h4>
<p>If you are not an Apache committer, click the Yes link and enter a <i>anonymous</i> for the username and leave the password empty</p>
<![endif]-->
</div>
<div class="modal-footer">
Do you have an Apache ID?
<a href="javascript:void(location.href='https://cms.apache.org/redirect?uri='+escape(location.href))" class="btn">Yes</a>
<a href="javascript:void(location.href='https://anonymous:@cms.apache.org/redirect?uri='+escape(location.href))" class="btn">No</a>
</div>
</div>
<script src="./../resources/js/bootstrap-modal.js"></script>
<footer>
<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>
</footer>
</div> <!-- /container -->
<!-- Javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="./../resources/js/bootstrap-dropdown.js"></script>
</body>
</html>