EJB 3 本地测试,出现错误

EJB 3 Test Locally, Getting Error

我创建了一个 web 项目并创建了一个 EJB(接口:LibrarySessionBeanRemote.java 和 class:LibrarySessionBean)。我已经在 JBoss 7.1 服务器上部署了 war 文件。以下是两个文件的代码:

LibrarySessionBeanRemote.java

package com.practice.stateless;

import java.util.List;

import javax.ejb.Remote;

@Remote
public interface LibrarySessionBeanRemote {

    void addBook(String bookName);

    List<String> getBooks();

}

LibrarySessionBean.java

package com.practice.stateless;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

@Stateless
public class LibrarySessionBean implements LibrarySessionBeanRemote {

    List<String> bookShelf;

    public LibrarySessionBean() {
        bookShelf = new ArrayList<String>();
    }

    @Override
    public void addBook(final String bookName) {
        bookShelf.add(bookName);
    }

    @Override
    public List<String> getBooks() {
        return bookShelf;
    }
}

我试图在 main 方法中本地调用 EJB,下面是代码:

LibrarySessionBeanTest2

package com.practice.stateless.test;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.practice.stateless.LibrarySessionBean;
import com.practice.stateless.LibrarySessionBeanRemote;

public class LibrarySessionBeanTest2 {

    public static LibrarySessionBeanRemote doLookup() throws NamingException {
        final Properties jndiProp = new Properties();
        jndiProp.put(Context.INITIAL_CONTEXT_FACTORY,
                "org.jboss.naming.remote.client.InitialContextFactory");
        jndiProp.put(Context.PROVIDER_URL, "remote://localhost:4447");
        jndiProp.put(Context.SECURITY_PRINCIPAL, "username");
        jndiProp.put(Context.SECURITY_CREDENTIALS, "password");

        final String appName = "";

        final String moduleName = "StatelessExample";

        final String distinctName = "";

        final String beanName = LibrarySessionBean.class.getSimpleName();

        final String viewClassName = LibrarySessionBeanRemote.class.getName();

        final Context ctx = new InitialContext(jndiProp);
        final String jndiName = "ejb:" + appName + "/" + moduleName + "/"
                + distinctName + "/" + beanName + "!" + viewClassName;
        // jndiName = "java:global/StatelessExample/LibrarySessionBean";
        return (LibrarySessionBeanRemote) ctx.lookup(jndiName);

    }

    public static void invokeStatelessBean() throws NamingException {
        final LibrarySessionBeanRemote librarySessionBeanRemote = doLookup();
        librarySessionBeanRemote.addBook("book 1");
        for (final String book : librarySessionBeanRemote.getBooks()) {
            System.out.println(book);
        }
    }

    public static void main(final String[] args) {
        try {
            invokeStatelessBean();
        } catch (final NamingException e) {
            e.printStackTrace();
        }
    }

}

在 运行 LibrarySessionBeanTest2 class 之后,我遇到以下错误:

javax.naming.NameNotFoundException: ejb:/StatelessExample//LibrarySessionBean!com.practice.stateless.LibrarySessionBeanRemote -- service jboss.naming.context.java.jboss.exported.ejb:.StatelessExample."LibrarySessionBean!com.practice.stateless.LibrarySessionBeanRemote"
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
    at org.jboss.naming.remote.protocol.v1.Protocol.handleServerMessage(Protocol.java:127)
    at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever.run(RemoteNamingServerV1.java:73)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

我是 EJB 3 的新手,所以我不知道我是否正确使用了 JNDI 名称。如果有人能帮我解决这个问题就太好了。

现在问题已通过添加另外两个属性得到解决,请在下面找到它们:

jndiProp.put("jboss.naming.client.ejb.context", true);
jndiProp.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");