java - 已部署的 EJB 的 JNDI 查找失败

标签 java jakarta-ee netbeans deployment glassfish

我编写了一个 EJB 模块,并将其部署到 GlassFish。然后,我编写了一个企业应用程序客户端,并将其也部署到 GlassFish。

无状态bean的代码:

package remote;

@Stateless
@Remote(IPersonEJB.class)
@LocalBean
public class PersonEJB implements IPersonEJB{

@PersistenceContext(unitName = "JobsPU")
private EntityManager em;

@Override
public Person giveJobToPerson(Job job, Person person) {
    em.persist(person);
    em.flush();
    job.setEmployeeID(person.getId());
    em.persist(job);
    return person;
}

// Add business logic below. (Right-click in editor and choose
// "Insert Code > Add Business Method")

@Override
public Person getPerson(Long id) {
    return em.find(Person.class, id);
}
}

已部署的 EBJ 的 Persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="JobsPU" transaction-type="JTA">
    <jta-data-source>jdbc/__TimerPool</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.logging.level" value="INFO"/>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
      <property name="eclipselink.target-database" value="Derby"/>
    </properties>
  </persistence-unit>
</persistence>

我将项目作为库导入到客户的项目中(通过 Netbeans),以便使用我需要的类:

package jobsclient;

import Entities.Address;
import Entities.Job;
import Entities.Person;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import remote.IPersonEJB;

public class Main {

    public static void main(String[] args) throws NamingException {
        Context ctx = new InitialContext();
        IPersonEJB personEJB = (IPersonEJB) ctx.lookup("java:global/Jobs/IPersonEJB!remote.IPersonEJB");
        Address add = new Address("Fake street", "Fake city", "FC", "83100");
        Person p = new Person("Jack", "Black", add);
        Job j = new Job("Programmer", 3500f);

        Person persistente = personEJB.giveJobToPerson(j, p);
        if (persistente.getId() != null) {
            System.out.println("Creazione effettuata");
        }    }

}

如果我尝试运行客户端,我会收到以下异常:

Warning: C:\Users\Paolo\Documents\NetBeansProjects\JobsClient\dist\gfdeploy\JobsClient does not exist.
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
    at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)
Caused by: javax.naming.NamingException: Lookup failed for 'java:global/Jobs/IPersonEJB!remote.IPersonEJB' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NameNotFoundException: IPersonEJB!remote.IPersonEJB not found]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    at jobsclient.Main.main(Main.java:28)
    ... 6 more
Caused by: javax.naming.NameNotFoundException: IPersonEJB!remote.IPersonEJB not found
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237)
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204)
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:208)
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:208)
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:66)
    at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:143)
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:173)
    at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528)
    at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930)
    at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496)
    at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Java Result: 1
run:
BUILD SUCCESSFUL (total time: 9 seconds)

我试图找到解决方案,我在 Stackoverflow 上阅读了一些其他问题,例如这个问题,但我无法解决我的问题。我想这是 JNDI 名称的问题?但我在任何地方都找不到它部署的名称(我在 glassfish 管理控制台中到处查看),并且我认为名称字符串的格式是正确的(按照我阅读的指南)。

我使用 netbeans 的部署功能部署了这两个应用程序。也许我缺少一些配置文件(ejb.xml 或其他)?

最佳答案

我刚刚发现错误:我正在查找远程接口(interface),而不是 bean 本身。

    IPersonEJB personEJB = (IPersonEJB) ctx.lookup("java:global/Jobs/IPersonEJB!remote.IPersonEJB");

应该是

    IPersonEJB personEJB = (IPersonEJB) ctx.lookup("java:global/Jobs/PersonEJB!remote.IPersonEJB");

关于java - 已部署的 EJB 的 JNDI 查找失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42256053/

相关文章:

Java/Swing/Maven : no main manifest attribute

java - 在 URL 中使用 JSESSIONID 时,会创建一个新 session

java - jprobe 分析器和 netbeans 有什么缺点吗?

java - c :set tag to set a non-primitive type value

java - 检查a是否包含Java中的对象

java - 如何在具有通用模型的另一个数据表中的 rowExpansion 部分中创建数据表

java - spring + jsp + hibernate 中的 NotReadablePropertyException

Netbeans 自动缩进和花括号 }{

java - 在 NetBeans 上运行 JavaFX 应用程序时出现 "URI is not hierarchical"

java - 如何在android java中使用intent切换到同一 Activity 的两个 fragment