无法从客户端应用程序获取Bean
问题描述:
我已经在Wildfly中部署了一个名为User Data的模块和一个会话Bean的EJB3应用程序。 这是我的项目结构: 无法从客户端应用程序获取Bean
这是的UserData状态bean:
@Stateful
@Remote(UserDataRemote.class)
public class UserData implements UserDataRemote, UserDataLocal {
private String name;
/**
* Default constructor.
*/
public UserData() {
// TODO Auto-generated constructor stub
}
@Override
public void saveName(String name) {
// TODO Auto-generated method stub
this.name =name;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
}
这是控制台的作物:
这是我在尝试通过JNDI从应用程序中检索它:
public static void main (String args[]) {
Properties jndiProperties = new Properties();
jndiProperties.put("jboss.naming.client.ejb.context", true);
jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
try {
InitialContext namingContext = new InitialContext(jndiProperties);
UserDataRemote userRemote = (UserDataRemote)namingContext.lookup("java:global/testEJB/UserData!entities.UserDataRemote");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
**更新** 我也尝试使用这个网址查询:
UserDataRemote userRemote = (UserDataRemote)namingContext.lookup("ejb:/testEJB//UserData!entities.UserDataRemote?stateful");
但它无法找到它。
这是我的错误:
ott 06, 2017 7:45:51 AM org.xnio.Xnio <clinit>
INFO: XNIO version 3.4.0.Final
ott 06, 2017 7:45:51 AM org.xnio.nio.NioXnio <clinit>
INFO: XNIO NIO Implementation Version 3.4.0.Final
ott 06, 2017 7:45:51 AM org.jboss.remoting3.EndpointImpl <clinit>
INFO: JBoss Remoting version 4.0.21.Final
ott 06, 2017 7:45:52 AM org.jboss.ejb.client.remoting.VersionReceiver handleMessage
INFO: EJBCLIENT000017: Received server version 2 and marshalling strategies [river]
ott 06, 2017 7:45:52 AM org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiver associate
INFO: EJBCLIENT000013: Successful version handshake completed for receiver context EJBReceiverContext{[email protected], receiver=Remoting connection EJB receiver [connection=Remoting connection <13359fd6> on endpoint "config-based-naming-client-endpoint" <6536e911>,channel=jboss.ejb,nodename=macbook-pro-di-andrea]} on channel Channel ID 96d8a7d7 (outbound) of Remoting connection 1f36e637 to /127.0.0.1:8080 of endpoint "config-based-naming-client-endpoint" <6536e911>
javax.naming.NameNotFoundException: global/testEJB/UserData!entities.UserDataRemote -- service jboss.naming.context.java.jboss.exported.global.testEJB."UserData!entities.UserDataRemote"
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:184)
at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
答
如果直接部署EJB JAR然后查找应
UserDataRemote userRemote =
(UserDataRemote) namingContext.lookup("testEJB/UserData!entities.UserDataRemote");
如果EJB JAR是装在一个EAR,那么你需要添加EAR名(应用程序名)
UserDataRemote userRemote =
(UserDataRemote) namingContext.lookup("<ear-name>/testEJB/UserData!entities.UserDataRemote");
答
我想,你应该使用其他值jndiProperties
和使用另一个值作为EJB的查找。我已经在下面修改了你的代码。
public static void main (String args[]) {
Properties jndiProperties = new Properties();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
jndiProperties.put("jboss.naming.client.ejb.context", true);
try {
InitialContext namingContext = new InitialContext(jndiProperties);
UserDataRemote userRemote = (UserDataRemote)namingContext.lookup("ejb:/testEJB/UserData!entities.UserDataRemote");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
给定的查找值适用于部署在JAR文件(不是EAR文件)中的无状态EJB。如果您的EJB是有状态的,则必须在末尾添加以下"?stateful"
。 如何为EAR文件创建查找值在下面的链接中介绍。
我的Wildfly服务器显示的JNDI绑定与您的类似。他们并没有从ejb:...
开始。但是查找仍然有效。
此外,运行时应该在类路径中有一个文件jboss-ejb-client.properties
。 jboss-client.jar中的类将查找此文件。
这里是我的内容:
endpoint.name=client-endpoint
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
你可以在这里找到link更多信息。
区分EAR或JAR文件中的部署很重要。但没有领先的“ejb:”我无法访问我的豆。 – jaysee
看看这里的一个工作示例:https:// github。com/simasch/jbosseap7ejbdemo –