On Apr 14, 2009, at 9:52 AM, Laird Nelson wrote:

In the simple-webservice example that ships with OpenEJB 3.1, the interface (CalculatorWs) is annotated with @WebService (and nothing else), and the implementation (CalculatorImpl) is annotated *both *with @Stateless *and * @WebService, and implements CalculatorWs. The associated test passes ( CalculatorTest)--and it only tests the web service functionality, not the
EJB functionality.

It definitely does test the "EJB" functionality. Transactions are started, interceptors are invoked, etc. etc. The only real difference between invoking the EJB via a Local interface or a Web Service is the client and how the invocation is sent to the container for processing. But strictly speaking both "views" reach StatelessContainer.invoke(...) and are handled identically.

It's my understanding that in EJB 3.0 if you don't explicitly mark any
business interface as being either @Remote or @Local, it defaults to @Local,

Close. @WebService counts too (either on the interface itself or via "endpointInterface = "org.superbiz.calculator.CalculatorWs"").

So there's no defaulting in this situation. The interface is marked explicitly as a service endpoint interface (<service-endpoint> in the ejb-jar.xml) and therefore not implicitly marked as Local (<business- local>).

From these conversations, I would expect that if I were to add a test to CalculatorTest.java that attempted to locate the "CalculatorImplLocal" bean
in JNDI, either that lookup would fail or an invocation on the
resulting CalculatorWs
interface would fail.  Is this correct?

If it *is* correct, why is the CalculatorImpl class in that example marked as @Stateless (in addition to @WebService), since I can't see any way (from our discussions) that any test written against the EJB interfaces could
pass?

Not sure I followed the logic, but as mentioned above in all cases it is an EJB invocation regardless of the "view" the client has of the bean (i.e. web service vs. business local vs. business remote, etc.). Think of them as different doors to the exact same room with the exact same stuff in it. In this situation, @WebService is a door and @Stateless is the room and the stuff is all the things the bean can lookup or have injected. If you add an @Local interface, you simply add another door to the room, not another room. Regardless of which door you use, you still end up at the same place and can use the same stuff.

-David

Reply via email to