我在调用远程EJB时遇到了麻烦:我第一次必须这样做而且我可能会遗漏一些东西。我已经在网上阅读了很多教程,在SO
上有几个答案,但我无法解决。这就是我迄今为止所做的。
我的情景是:
我在EAR
Wildfly 10.0.0.Final
和server-ear
下部署了两个client-ear
。
在server-ear
我有server-api
和server-ejb
,第一个是包含EJB
接口的简单Java模块,第二个是{{} 1}}包含实现的模块。
那些将是
EJB
及其实施
@Remote
public interface DummyApi {
String getSomething();
}
在@Stateless
@Remote(DummyApi.class)
public class DummyApiImpl implements DummyApi {
@Override
public String getSomething() {
return "SOMETHING";
}
}
我有一个简单的client-ear
模块(EJB
)定义了一个单client-ejb
,其中引用了EJB
接口:
DummyApi
在@javax.ejb.Singleton
public class DummyClient {
private static final Logger log = LoggerFactory.getLogger(DummyClient.class);
private @EJB DummyApi dummyApi;
@PostConstruct
public void postConstruct() {
log.debug("***** " + dummyApi.getSomething() + "******");
}
}
我也将client-ejb
文件放在jboss-ejb-client.properties
下
src/main/resources
至于那些模块的相互依赖性(我使用Maven):
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port = 8080
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
和
server-ear
|---- server-api [compile]
|---- server-ejb [compile]
|-- server-api [provided]
两个client-ear
|---- server-api [compile]
|---- client-ejb [compile]
|-- server-api [provided]
都部署在同一个本地EAR
上(服务器的干净安装,无需任何自定义)。当我启动服务器时,Wildfly 10.0.0.Final
没有问题。
server-ear
因以下异常而失败
client-ear
我错过了什么或做错了什么?
答案 0 :(得分:1)
@EJB仅在bean位于同一个包(在您的情况下为.ear)时才有效。
您需要使用启动时出现在服务器日志中的java:app名称进行查找。像这样:
DummyApi api = (DummyApi) context.lookup("/server-ear/server-ejb/DummyApiImpl!path.to.DummyApi")
创建上下文:
private static Context createContextWildfly(String provider) throws NamingException {
final Hashtable<String, String> properties = new Hashtable<>();
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
properties.put("jboss.naming.client.ejb.context", "true");
properties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
return new InitialContext(properties);
}
使用此功能,您不需要jboss-ejb-client.properties