Connecting to EJBs from Spring
Join the DZone community and get the full member experience.
Join For FreeWhile preparing my next exercise I had to first find a way how to connect to a remote SLSB from Spring.
It turned out to be childishly simple. See how I did it.
Writing SLSB component
First I needed a remote SLSB.
Using M2Eclipse create a Maven 2 project. From the archetypes selection window I typed mojo in filter field (mojo archetypes are codehaus archetypes, I wrote about them in: Don't use org.apache.maven.archetypes!) and selected ejb3 archetype.
I wrote a simple SLSB component:
I downloaded OpenEJB archive from here: http://openejb.apache.org/download.html and unzipped it. I was done with installation :)
I copied built in previous step jar to apps directory, then went to bin directory and ran openejb(.bat).
Writing JUnit integration test
First I wrote a simple integration test (using failsafe plugin, there are many post on my blog about it, the key one is: Maven2 integration testing with failsafe and jetty plugins) to verify if the SLSB is actually working:
Connecting to EJB from Spring
I found out a Spring component called org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean. It uses AOP behinde the scenes to create a proxy for a remote SLSB. All you need is just an interface.
First I had to add Spring dependencies to my pom.xml. These were:
Writing Spring test
I added one more field to my test:
Source code download
A complete source code download can be found here: Connecting-to-EJB-from-Spring.zip.
Summary
Isn't it beautiful? You get an instance of a remote SLSB as a Spring bean. I definitely like it!
thanks,
Łukasz
It turned out to be childishly simple. See how I did it.
Writing SLSB component
First I needed a remote SLSB.
Using M2Eclipse create a Maven 2 project. From the archetypes selection window I typed mojo in filter field (mojo archetypes are codehaus archetypes, I wrote about them in: Don't use org.apache.maven.archetypes!) and selected ejb3 archetype.
I wrote a simple SLSB component:
package org.xh.studies.openejb;
import javax.ejb.Remote;
@Remote
public interface Greeter {
String sayHello(String to);
}
package org.xh.studies.openejb;
import javax.ejb.Stateless;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@Stateless
public class GreeterImpl implements Greeter {
private static final Log log = LogFactory.getLog(GreeterImpl.class);
public String sayHello(String to) {
log.info("Saying hi to: " + to);
return "Hello " + to + "! How are you?";
}
}I built it with:mvn packageDeploying to OpenEJB
I downloaded OpenEJB archive from here: http://openejb.apache.org/download.html and unzipped it. I was done with installation :)
I copied built in previous step jar to apps directory, then went to bin directory and ran openejb(.bat).
Writing JUnit integration test
First I wrote a simple integration test (using failsafe plugin, there are many post on my blog about it, the key one is: Maven2 integration testing with failsafe and jetty plugins) to verify if the SLSB is actually working:
public class GreeterIT {
private static Context ctx;
@BeforeClass
public static void setUp() throws NamingException {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
env.put(Context.PROVIDER_URL, "ejbd://localhost:4201");
ctx = new InitialContext(env);
}
@AfterClass
public static void tearDown() throws NamingException {
ctx.close();
}
@Test
public void sayHelloRemoteEJBTest() throws NamingException {
Greeter greeter = (Greeter) ctx.lookup("GreeterImplRemote");
String result = greeter.sayHello("Łukasz");
String expected = "Hello Łukasz! How are you?";
Assert.assertEquals(expected, result);
}
}I ran the test and it passed.Connecting to EJB from Spring
I found out a Spring component called org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean. It uses AOP behinde the scenes to create a proxy for a remote SLSB. All you need is just an interface.
First I had to add Spring dependencies to my pom.xml. These were:
spring-beans spring-context spring-aopThen I created a file called META-INF/spring/beans.xml and wrote:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">org.apache.openejb.client.RemoteInitialContextFactory</prop>
<prop key="java.naming.provider.url">ejbd://localhost:4201</prop>
</props>
</property>
</bean>
<bean id="greeterBean"
class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean">
<property name="jndiName" value="GreeterImplRemote" />
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="businessInterface" value="org.xh.studies.openejb.Greeter" />
</bean>
</beans>In the above file I created a greeterBean which was a dynamic proxy and, thanks to AOP, would behave like a Greeter object.Writing Spring test
I added one more field to my test:
private static ApplicationContext springCtx;Then in @BeforeClass class I added ApplicationContext initialisation code:
springCtx = new ClassPathXmlApplicationContext("META-INF/spring/beans.xml");
Finally I wrote a new method to test what I intended to do first, connecting to a remote SLSB from Spring:@Test
public void sayHelloSpringProxyTest() throws NamingException {
Greeter greeter = (Greeter) springCtx.getBean("greeterBean");
String result = greeter.sayHello("Łukasz");
String expected = "Hello Łukasz! How are you?";
Assert.assertEquals(expected, result);
}It worked!Source code download
A complete source code download can be found here: Connecting-to-EJB-from-Spring.zip.
Summary
Isn't it beautiful? You get an instance of a remote SLSB as a Spring bean. I definitely like it!
thanks,
Łukasz
Spring Framework
Published at DZone with permission of Łukasz Budnik. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments