EJB 3.1 @LocalBean vs no annotation
JavaJakarta EeEjbJava Problem Overview
I understand the difference between local view, remote view and no-interface view. I just don't understand what is the difference between "no view" (no annotation) and no-interface view. And also why should I annotate my interface with @Local
? What if I don't annotate the interface in at all, is there a difference?
Java Solutions
Solution 1 - Java
The rules are (from memory):
- Bean has a
@LocalBean
annotation -> bean has a no-interface view - Bean has a
@Local
annotation -> bean has a local view - Bean has a
@Remote
annotation -> bean has a remote view - Bean has no view annotations, but directly implements an interface which has a @Local annotation -> bean has a local view
- Bean has no view annotations, but directly implements an interface which has a @Remote annotation -> bean has a remote view
- Bean has no view annotations, but directly implements an interface which has no view annotations -> bean has a local view
- Bean has no view annotations, and implements no interfaces -> bean has a no-interface view
So, using @LocalBean
and using no annotation at all are both ways of getting a no-interface view. If you just want a no-interface view, then the simplest thing is not to annotate. Provided you're not also implementing any interfaces.
Part of the reason @LocalBean
exists to add a no-interface view to a bean which also has an interface view. I imagine the scenario uppermost in the spec authors' minds was one where you have a bean like:
@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map<String, String> getPreferences();
}
Where you would want to expose both methods locally, but only the coarser-grained getPreferences()
remotely. You can do that by declaring a remote interface with just that method, then just slapping @LocalBean
on the bean class. Without it, you'd have to write a pointless local interface just to expose both methods locally.
Or, to look at it another way, the @LocalBean
exists because there is such a thing as a no-interface view, and the no-annotation option exists as a handy shortcut.
Solution 2 - Java
- Remote EJBs: can be accessed from remote clients (clients running on a different JVM such as Swing or JavaFX clients which run on the user machine)
- Local EJBs: can only be access from other "components" running on the same JVM, e.g. Web Front-ends, other EJBs
- No-interface view: same as Local but without specifing the business interface
- No annotation: a simple POJO but not an EJB
Local/ No-interface views are more efficient than remote EJBs, since objects references can be passed around.
Solution 3 - Java
I think that the confusion you/we are feeling is a result of history / backwards compitability (so to speak). I can't dicern any difference (except that the spec. requires implementations to create an interface if we use local-view)
> The no-interface view has the same behavior as the EJB 3.0 local view, > for example, it supports features such as pass-by-reference calling > semantics and transaction and security propagation. However, a > no-interface view does not require a separate interface, that is, all > public methods of the bean class are automatically exposed to the > caller. By default, any session bean that has an empty implements > clause and does not define any other local or remote client views, > exposes a no-interface client view.