blob: 4bf9acd04a1eb93a68b7e40739a99c191112f6fa [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></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></small><br>
<h1>
<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>
<p><div class="note">}OpenEJB 3.1 and later users should refer to the [Spring] page.{note}</p>
<h1>Bootstrapping OpenEJB in Spring</h1>
<p>If you wish to use OpenEJB inside Spring you can do so pretty easily. Include OpenEJB and its dependencies in your classpath as you would in a plain embedded scenario then add a custom factory like the following:</p>
<pre><code>public class OpenEjbFactoryBean implements org.springframework.beans.factory.FactoryBean {
private Properties properties = new Properties();
public OpenEjbFactoryBean() {
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
}
public Properties getJndiEnvironment() {
return properties;
}
public void setJndiEnvironment(Properties properties) {
this.properties.putAll(properties);
}
public Object getObject() {
try {
return new InitialContext(properties);
} catch (NamingException e) {
throw new RuntimeException(e);
}
}
public Class getObjectType(){
return Context.class;
}
boolean isSingleton() {
return true;
}
}
</code></pre>
<p>And include that at the top of your spring xml file as follows:</p>
<pre><code>&lt;bean id="OpenEjbContext" class="org.acme.OpenEjbFactoryBean"&gt;
&lt;property name="jndiEnvironment"&gt;
&lt;props&gt;
&lt;prop key="myDs"&gt;new://Resource?type=DataSource&lt;/prop&gt;
&lt;prop key="myDs.JdbcDriver"&gt;com.mysql.jdbc.Driver&lt;/prop&gt;
&lt;prop key="myDs.JdbcUrl"&gt;jdbc:mysql://localhost/midastest?createDatabaseIfNotExist=true&lt;/prop&gt;
&lt;prop key="myDs.UserName"&gt;root&lt;/prop&gt;
&lt;prop key="myDs.Password"&gt;&lt;/prop&gt;
&lt;/props&gt;
&lt;/property&gt;
&lt;/bean&gt;
</code></pre>
<p>The value of <props> is meant to be illustrative of the kinds of properties you can pass into OpenEJB. It's possible to create any number of datasources, topics, queues, containers and more this way.</p>
<p>Just as with Unit Testing, OpenEJB will find and automatically deploy all the EJB beans it [finds in the classpath|Application discovery via the classpath]. You can then expose any of these things to other Spring components with custom factory beans.</p>
<h1>Injecting OpenEJB-created resources into Spring components</h1>
<p>If you want to have any of the Topics, Queues, DataSources, EntityManagers or more that OpenEJB creates injected into components that Spring creates, here's one technique....</p>
<p>Let's say you have a persistence unit called "<em>OrangeUnit</em>" declared in a persistence.xml file. One way to get the related <em>EntityManager</em> created by OpenEJB is to do as follows. Create an @Stateless bean with an @PersistenceContext ref in it, then use a factory bean to look it up, pull the EntityManager out and return it</p>
<p>OrangeUnitBean.java</p>
<pre><code>/*
* OpenEJB will automatically find this bean. Just put it in the same jar
* that your META-INF/persistence.xml file is located in and make sure that
* that same jar file also has a META-INF/ejb-jar.xml file. The ejb-jar.xml
* need only contain the text "&lt;ejb-jar/&gt;" at minimum.
*/
@Stateless
public class OrangeUnitBean implements OrangeUnitLocal {
@PersistenceContext(unitName="OrangeUnit")
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
}
</code></pre>
<p>OrangeUnitLocal.java</p>
<pre><code>/**
* The local interface for the OrangeUnitBean
*/
public interface OrangeUnitLocal {
public EntityManager getEntityManager();
}
</code></pre>
<p>OrangeUnitFactoryBean.java</p>
<pre><code>/**
* This factory bean will lookup the OrangeUnitBean using the javax.naming.Context
* that is created via the OpenEjbFactoryBean above. It will simply grab the EntityManager
* from that bean and hand it over to Spring. Anyone in Spring-land can then easily get
* a reference to the EntityManager by simply referencing this factory bean.
*/
public class OrangeUnitFactoryBean implements org.springframework.beans.factory.FactoryBean {
private Context context;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public Object getObject() {
try {
ResourceLocal bean = (ResourceLocal) context.lookup("OrangeUnitBeanLocal");
return bean.getEntityManager();
} catch (NamingException e) {
throw new RuntimeException(e);
}
}
public Class getObjectType(){
return EntityManager.class;
}
boolean isSingleton() {
return true;
}
}
</code></pre>
<p>The factory bean would then be declared in your spring xml file as follows:</p>
<pre><code>&lt;bean id="OrangeUnit" class="org.acme.OrangeUnitFactoryBean"&gt;
&lt;property name="context" ref="OpenEjbContext"&gt;
&lt;/bean&gt;
</code></pre>
<p>The EntityManager can then easily be consumed by a spring bean.</p>
<pre><code>public class SomePojo {
private EntityManager entityManager;
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
...
}
</code></pre>
<p>In the spring xml</p>
<pre><code>&lt;bean id="SomePojo" class="org.acme.SomePojo"&gt;
&lt;property name="entityManager" ref="OrangeUnit"&gt;
&lt;/bean&gt;
</code></pre>
<p>Here's what all three declarations would look like together in your spring xml:</p>
<p>Spring bean definitions combined</p>
<pre><code>&lt;bean id="OpenEjbContext" class="org.acme.OpenEjbFactoryBean"&gt;
&lt;property name="jndiEnvironment"&gt;
&lt;props&gt;
&lt;prop key="myDs"&gt;new://Resource?type=DataSource&lt;/prop&gt;
&lt;prop key="myDs.JdbcDriver"&gt;com.mysql.jdbc.Driver&lt;/prop&gt;
&lt;prop key="myDs.JdbcUrl"&gt;jdbc:mysql://localhost/midastest?createDatabaseIfNotExist=true&lt;/prop&gt;
&lt;prop key="myDs.UserName"&gt;root&lt;/prop&gt;
&lt;prop key="myDs.Password"&gt;&lt;/prop&gt;
&lt;/props&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="OrangeUnit" class="org.acme.OrangeUnitFactoryBean"&gt;
&lt;property name="context" ref="OpenEjbContext"&gt;
&lt;/bean&gt;
&lt;bean id="SomePojo" class="org.acme.SomePojo"&gt;
&lt;property name="entityManager" ref="OrangeUnit"&gt;
&lt;/bean&gt;
</code></pre>
<p><div class="info">:title=Some more useful info.}
Here is a bunch of links suggested by a user. If anybody has time to go through them and write a doc, that would be great. These links explain how to make available spring components to openejb
http://twasink.net/blog/archives/2007/01/using_spring_wi.html
http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/ejb/interceptor/SpringBeanAutowiringInterceptor.html
http://wiki.netbeans.org/MavenSpringEJBsOnGlassfish
<div class="info">} </p>
<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>