5

我正在使用以下 Bean 类:

@Stateless(name="UserBean", mappedName="UserBean")
@LocalBean
public class User implements UserRemote {

@PersistenceContext
private EntityManager em;

public User() {

}

public String login(String username, String password) {

    Query query = em.createQuery("...");
    return "xyz";
}

}

我的方法是

public String myMethod()    {

    try {
        User user = (User) new InitialContext().lookup("UserBean");
        return "xyz";
    } catch (NamingException e) {
        e.printStackTrace();
    }
    return null;        
}

在这里我得到一个

javax.naming.NameNotFoundException: Unable to resolve 'UserBean'. Resolved ''; remaining name 'UserBean'

JNDI 查找名称“UserBean”似乎是正确的。不知道是什么问题。有人可以帮忙吗?我已经使用 JPA 2.0 和 EJB 3.x 在 weblogic 12c 上部署了我的应用程序

提前致谢。

4

3 回答 3

4

问题是我使用的是远程接口。仅使用没有映射名称的@stateless 注释以下代码有效:

new InitialContext().lookup("java:global/ProjectName/ModuleName/BeanName!FullyQualif‌​iedNameOfRemoteInterface"); 

谢谢@安德烈!

于 2013-06-18T09:41:52.657 回答
1

虽然这个问题两年前就已经回答了,但我想对此添加评论。使用 mappedName 属性应该没有问题。如果您在 WebLogic 上进行部署,则必须添加#[fully.qualified.interface.name]查找。

例如mappedName = "UserBean",,EJB 在 com.acme.user 包中实现了一个名为 MyInterface 的接口,那么查找就像

... = new InitialContext().lookup("UserBean#com.acme.user.MyInterface");
于 2015-03-31T08:49:51.200 回答
1

使用 Portable JNDI Name 可能是一个更好的主意,即只用注释@Stateless

https://blogs.oracle.com/kensaks/entry/application_specified_portable_jndi_names

于 2013-02-18T14:31:17.063 回答