繁体   English   中英

从 Tomcat 通过 HTTP 在 Payara 服务器中调用远程 EJB 时出现 NameNotFoundException

[英]NameNotFoundException when invoking Remote EJB in Payara server via HTTP from Tomcat

我在 Payara Server 5.2022.2 中部署了一个 EJB 应用程序。

 @Remote 
 public interface City { 
   public Integer getVisits();
}
@Stateless(name = "City")
public class CityEJB implements City, Serializable {
}

我希望通过 HTTP 远程访问它,所以我在 payara 中启用了 ejb-invoker:

asadmin > set-ejb-invoker-configuration --enabled=true

当我检查 payara 管理控制台时,我可以在应用程序部分看到__ejb-invoker和我的应用程序。

在部署时,payara 控制台给我这个:

Portable JNDI names for EJB City: [java:global/JULY/TestMC/City, java:global/JULY/TestMC/City!cityall.City]

我应该指出,我的应用程序调用 TestMC 并且位于名为 JULY 的 EAR 中。 一切都部署在 payara 中,没有错误。

现在我想在 Tomcat 9 上运行的 Web 应用程序中获取 EJB:

public class InitialContextUtil {
    protected static InitialContext ic;
public static InitialContext getInstance() {
        if (ic == null) {
            final Properties initialContextProperties = new Properties();


            initialContextProperties.put(Context.INITIAL_CONTEXT_FACTORY,
                    "fish.payara.ejb.rest.client.RemoteEJBContextFactory");
            initialContextProperties.put(Context.PROVIDER_URL, "http://localhost:8080/ejb-invoker");
            
            try {
                ic = new InitialContext(initialContextProperties);
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
        return ic;
    }
}
public void getUserServices() {
            try {
                cityRemote = (City) InitialContextUtil.getInstance().lookup(
                        "java:global/JULY/TestMC/City"); 
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    }

在 pom.xml 我已经包含了必要的依赖项:

<dependency>
    <groupId>fish.payara.extras</groupId>
    <artifactId>ejb-http-client</artifactId>
    <version>5.2022.2</version>
</dependency>

但在执行时我得到:

javax.naming.NameNotFoundException: Name [global/JULY/TestMC/City] is not bound in this context.

我在 eclipse 2022-06 中执行所有内容并使用 JDK 11,但我也尝试在 eclipse 之外执行它,在 tomcat 和 payara 中运行这两个项目,但我得到了相同的结果。

我在使用 wildfly 时遇到了类似的问题,我只能使用旧版本的 eclipse(2020-06)和 JDK 8 来修复它,但我真的希望能够使用 JDK 11。

我修复它。 由于我在客户端使用 Tomcat,我必须添加新的依赖项:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.34</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.34</version>
</dependency>

此外,在进行查找时, InitialContext从 Tomcat 获得SelectorContext类,而不是从Payara获得 RemoteEJBContex。 为了解决这个问题,在创建InitialContext时,我必须在 RemoteEJBContext 所在的包中添加一个新属性Context.URL_PKG_PREFIXES

initialContextProperties.put(Context.INITIAL_CONTEXT_FACTORY,
                    "fish.payara.ejb.rest.client.RemoteEJBContextFactory");
initialContextProperties.put(Context.PROVIDER_URL, "http://localhost:8080/ejb-invoker");
initialContextProperties.put(Context.URL_PKG_PREFIXES, "fish.payara.ejb.http.client");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM