[英]Why EJB not found when ejb-invoker endpoint used with payara server for EJB remote calls via http
[英]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.