我常用的一个JNDI查找类,平进做EJB测试可以用
???? 以前做EJB测试时,老是要写一堆Properties.setValue之类的,很烦,总是要复制来复制去的,我就写了下面这个类,用起来会方便一点,平时做些小测试,玩玩是可以的,但做企业应用最好不要这样用,因为我把它们的Exception都catch了,只是在控制台输出一些信息,这是不好的做法哦!
下面是JNDIUtil.java的源码,大家直接复制下来,在最顶加个package就可以用了
import java.util.Properties;import javax.naming.InitialContext;import javax.naming.NamingException;/** * * @author Dao */public class JNDIUtil{ private static InitialContext ctx = null; public static Object lookup(String jndiBinding) { if (ctx == null) { //下面是JBOSS的配置,如果用其它EJB容器,得换了下面的某些信息 Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url", "localhost:1099"); props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); try { ctx = new InitialContext(props); } catch (NamingException ex) { System.out.println("InitialContext Exception: may be you used wrong property name or value!"); } } try { return ctx.lookup(jndiBinding); } catch (NamingException ex) { System.out.println("JNDI look up Exception: jndi name '" + jndiBinding + "' not found!"); } return null; }}?
?
下面写个调用的代码出来
package common;import com.mydomain.HaiHome;import com.mydomain.HaiRemote;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.rmi.PortableRemoteObject;/** * * @author Dao */public class Main{ /** * @param args the command line arguments */ public static void main(String[] args) throws CreateException, RemoteException { //下面是EJB2测试调用方法 Object objRef = JNDIUtil.lookup("HaiEJB"); HaiHome home = (HaiHome) PortableRemoteObject.narrow(objRef, HaiHome.class); HaiRemote remote = home.create(); System.out.println(remote.sayHai()); //下面是EJB3测试调用方法 Object objRef2 = JNDIUtil.lookup("HaiEJB"); HaiRemote haiRemote = (HaiRemote) objRef2; System.out.println(haiRemote.sayHai()); }} ?
?
其实我平时在做EJB3小应用时,还用偷懒,因为EJB3可以用Annotation,它可以直接在类中绑定JNDI Name,所以我通常都会绑定一个跟他类名一样的JNDI Name,用法如下
?
@Stateless@Remote({HaiRemote.class})//如果下面的RemoteBinding用不了,那就是你少了jboss-annotations-ejb3.jar这个包@RemoteBinding(jndiBinding="HaiSessionBean") //这里我绑定了跟类名一样的JNDI名称public class HaiSessionBean implements HaiRemote{ public String sayHai(String name) { return name + " say hello to you!"; }}?
下面我们对JNDIUtil.java加多一个Object lookup(Class cla)方法,改后如下
import java.util.Properties;import javax.naming.InitialContext;import javax.naming.NamingException;/** * * @author Dao */public class JNDIUtil{ private static InitialContext ctx = null; public static Object lookup(String jndiBinding) { if (ctx == null) { Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url", "localhost:1099"); props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); try { ctx = new InitialContext(props); } catch (NamingException ex) { System.out.println("InitialContext Exception: may be you used wrong property name or value!"); } } try { return ctx.lookup(jndiBinding); } catch (NamingException ex) { System.out.println("JNDI look up Exception: jndi name '" + jndiBinding + "' not found!"); } return null; } public static Object lookup(Class cla) { String simpleName = cla.getSimpleName(); return lookup(simpleName); }}?
?
下面我们看看调用时有什么变化
?
import com.mydomain.HaiSessionBean;import com.mydomain.HaiRemote;import java.rmi.RemoteException;import javax.ejb.CreateException;/** * * @author Dao */public class Main{ /** * @param args the command line arguments */ public static void main(String[] args) throws CreateException, RemoteException { //看下面这句的用法,这样我就避免了使用String,减少出错的机会 //事实证明,减少String参数的使用,可以减少很多很多不必要的错误哦,当然,要适当时才能这样做 //因为我的做法是不规范的,你做EJB分布式应用时就知道了,不过平时就,呵呵,省点时间学多点东西吧 HaiRemote haiRemote = (HaiRemote) JNDIUtil.lookup(HaiSessionBean.class); System.out.println(haiRemote.sayHai()); }}?