我现在的项目遇到一个这样的问题,希望高手能给与解答。万分感谢!
客户端调用stateless EJB,客户端Classpath没有ejb client jar以及ejb的任何类。试图通过反射来解决,
但是一直没有成功。使用如下代码,发现依然需要导入home接口才能运行。无法满足不导入任何接口的要求。
//REFLECT EJB..REFLECT..
import javax.ejb.*;
//no-need to import anything..!!
public Class client_ejb_reflection {
public static void main(String args[]){
//1. create initial context
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory" );
env.put(Context.PROVIDER_URL, "jnp://192.168.66.66:1099" );
env.put("Java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");Context c = new InitialContext(env);
//2. look-up home
Object home = ctx.lookup(JNDI_NAME);
EJBHome theHome =(EJBHome) PortableRemoteObject.narrow(home, EJBHome.class)
//3. create the remote
EJBMetaData md =
this.theHome.getEJBMetaData();
Class homeClass =
md.getHomeInterfaceClass();
EJBObject theRemote = (EJBObject)
this.invoke(homeClass,theHome,"create");
//4. use the remote
Class remoteClass =
md.getRemoteInterfaceClass();
String message =
this.invoke(remoteClass,theRemote,"getMessage");
}
static Object invoke(Class c,Object obj,String mname){
Method[] methods = c.getMethods();
String name=null;
Object r= null;
try {
for(int i = 0; i <methods.length ;i++) {
name = methods.getName();
if(name.startsWith(mname)) {
r = methods.invoke(obj,null);
}
}
} catch(Exception e){
e.printStackTrace();
}
return r;
}
}
如果不导入home接口,就会报如下错误:
javax.naming.CommunicationException [Root exception is java.lang.ClassNotFoundException: com.rchema.GET_CUSTOMERHome (no security manager: RMI class loader disabled)]
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:728)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at com.rchema.EJBClientDynamic.dynamic_invoke(EJBClientDynamic.java:73)
at com.rchema.EJBClientDynamic.main(EJBClientDynamic.java:52)