views:

2609

answers:

1

I am new to EJB3 and am missing something when it comes to accessing a @Remote @Stateless bean deployed as an ejb module inside an ear file. I want to access a remote bean in lima.ear from soup.ear.

Here is what I am doing now (somewhat abbreviated):

//deployed under lima.ear
@Remote
@Stateless
public interface LimaBean {
    String sayName();
}

I want to put LimaBean in the Soup:

//deployed in soup.ear
@Stateless
public class Soup implements SoupLocal {

    @EJB
    private LimaBean limaBean;

    public String taste() {
        return limaBean.sayName();
    }

 }

When I start JBoss I get the following error:

java.lang.RuntimeException: could not resolve global JNDI name for @EJB for container Soup: reference class: com.example.LimaBean ejbLink: not used by any EJBs

I have had a hard time finding out what this ejbLink is about, if that is the right path to go down.

If I deploy LimaBean as a jar file in jboss then everything works great!

I ran accross an article that had a section called "2.5.3. References between beans in different jars and different ears"

(http://jonas.ow2.org/doc/howto/jboss2_4-to-jonas3_0/html/x111.html)

Example of jboss.xml file for SB_BrowseRegions:

<jboss>
    <session>
        <ejb-name>SB_BrowseRegions</ejb-name>
        <ejb-ref>
            <ejb-ref-name>ejb/Region</ejb-ref-name>
            <jndi-name>protocol://serverName/directory/RegionHome</jndi-name>
        </ejb-ref>
    </session>
</jboss>

If I touch the soup.ear, after JBoss starts up then it deploys fine, so I am assuming I need to specify a dependency like the above article says.

But even after it deploys then I get an error when accessing the remote LimaBean:

Caused by: java.lang.IllegalArgumentException: Can not set com.soup.LimaBean field com.soup.Soup.limaBean to $Proxy147 at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) at java.lang.reflect.Field.set(Field.java:657) at org.jboss.injection.JndiFieldInjector.inject(JndiFieldInjector.java:115) ... 49 more

I have tried a few things but, if anyone can point me in the right direction about this I would appreciate it.

+1  A: 

It looks like the JNDI properties need to be set as if it were a remote client outside of the app server because of the ear isolation we have setup.

 properties.put(Context.PROVIDER_URL, url);
 InitialContext ctx = new InitialContext(properties);

Just specify the URL for the InitialContext and that should do the trick.

Tony Eichelberger