Class SimpleRemoteSlsbInvokerInterceptor

  extended by org.springframework.jndi.JndiAccessor
      extended by org.springframework.jndi.JndiLocatorSupport
          extended by org.springframework.jndi.JndiObjectLocator
              extended by org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
                  extended by org.springframework.ejb.access.AbstractRemoteSlsbInvokerInterceptor
                      extended by org.springframework.ejb.access.SimpleRemoteSlsbInvokerInterceptor
All Implemented Interfaces:
Advice, Interceptor, MethodInterceptor, DisposableBean, InitializingBean
Direct Known Subclasses:

public class SimpleRemoteSlsbInvokerInterceptor
extends AbstractRemoteSlsbInvokerInterceptor
implements DisposableBean

Basic invoker for a remote Stateless Session Bean. Designed for EJB 2.x, but works for EJB 3 Session Beans as well.

"Creates" a new EJB instance for each invocation, or caches the session bean instance for all invocations (see setCacheSessionBean(boolean)). See JndiObjectLocator for info on how to specify the JNDI location of the target EJB.

In a bean container, this class is normally best used as a singleton. However, if that bean container pre-instantiates singletons (as do the XML ApplicationContext variants) you may have a problem if the bean container is loaded before the EJB container loads the target EJB. That is because by default the JNDI lookup will be performed in the init method of this class and cached, but the EJB will not have been bound at the target location yet. The best solution is to set the "lookupHomeOnStartup" property to "false", in which case the home will be fetched on first access to the EJB. (This flag is only true by default for backwards compatibility reasons).

This invoker is typically used with an RMI business interface, which serves as super-interface of the EJB component interface. Alternatively, this invoker can also proxy a remote SLSB with a matching non-RMI business interface, i.e. an interface that mirrors the EJB business methods but does not declare RemoteExceptions. In the latter case, RemoteExceptions thrown by the EJB stub will automatically get converted to Spring's unchecked RemoteAccessException.

Rod Johnson, Juergen Hoeller
See Also:
RemoteAccessException, AbstractSlsbInvokerInterceptor.setLookupHomeOnStartup(boolean), AbstractSlsbInvokerInterceptor.setCacheHome(boolean), AbstractRemoteSlsbInvokerInterceptor.setRefreshHomeOnConnectFailure(boolean)

Field Summary
Fields inherited from class org.springframework.jndi.JndiLocatorSupport
Fields inherited from class org.springframework.jndi.JndiAccessor
Constructor Summary
Method Summary
 void destroy()
          Remove the cached session bean instance, if necessary.
protected  Object doInvoke(MethodInvocation invocation)
          This implementation "creates" a new EJB instance for each invocation.
protected  Object getSessionBeanInstance()
          Return an EJB component instance to delegate the call to.
protected  void refreshHome()
          Reset the cached session bean instance, if necessary.
protected  void releaseSessionBeanInstance(EJBObject ejb)
          Release the given EJB instance.
 void setCacheSessionBean(boolean cacheSessionBean)
          Set whether to cache the actual session bean object.
Methods inherited from class org.springframework.ejb.access.AbstractRemoteSlsbInvokerInterceptor
getCreateMethod, invokeInContext, isConnectFailure, isHomeRefreshable, lookup, newSessionBeanInstance, refreshAndRetry, removeSessionBeanInstance, setHomeInterface, setRefreshHomeOnConnectFailure
Methods inherited from class org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
afterPropertiesSet, create, getHome, invoke, setCacheHome, setExposeAccessContext, setLookupHomeOnStartup
Methods inherited from class org.springframework.jndi.JndiObjectLocator
getExpectedType, getJndiName, setExpectedType, setJndiName
Methods inherited from class org.springframework.jndi.JndiLocatorSupport
convertJndiName, isResourceRef, lookup, lookup, setResourceRef
Methods inherited from class org.springframework.jndi.JndiAccessor
getJndiEnvironment, getJndiTemplate, setJndiEnvironment, setJndiTemplate
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructor Detail


public SimpleRemoteSlsbInvokerInterceptor()
Method Detail


public void setCacheSessionBean(boolean cacheSessionBean)
Set whether to cache the actual session bean object.

Off by default for standard EJB compliance. Turn this flag on to optimize session bean access for servers that are known to allow for caching the actual session bean object.

See Also:


protected Object doInvoke(MethodInvocation invocation)
                   throws Throwable
This implementation "creates" a new EJB instance for each invocation. Can be overridden for custom invocation strategies.

Alternatively, override getSessionBeanInstance() and releaseSessionBeanInstance(javax.ejb.EJBObject) to change EJB instance creation, for example to hold a single shared EJB component instance.

Specified by:
doInvoke in class AbstractRemoteSlsbInvokerInterceptor
invocation - the AOP method invocation
the invocation result, if any
Throwable - in case of invocation failure
See Also:
AbstractSlsbInvokerInterceptor.getHome(), AbstractRemoteSlsbInvokerInterceptor.newSessionBeanInstance()


protected Object getSessionBeanInstance()
                                 throws NamingException,
Return an EJB component instance to delegate the call to.

The default implementation delegates to AbstractRemoteSlsbInvokerInterceptor.newSessionBeanInstance().

the EJB component instance
NamingException - if thrown by JNDI
InvocationTargetException - if thrown by the create method
See Also:


protected void releaseSessionBeanInstance(EJBObject ejb)
Release the given EJB instance.

The default implementation delegates to AbstractRemoteSlsbInvokerInterceptor.removeSessionBeanInstance(javax.ejb.EJBObject).

ejb - the EJB component instance to release
See Also:


protected void refreshHome()
                    throws NamingException
Reset the cached session bean instance, if necessary.

refreshHome in class AbstractSlsbInvokerInterceptor
NamingException - if thrown by the JNDI lookup
See Also:
JndiObjectLocator.lookup(), AbstractSlsbInvokerInterceptor.getCreateMethod(java.lang.Object)


public void destroy()
Remove the cached session bean instance, if necessary.

Specified by:
destroy in interface DisposableBean