谭明智的空间

我们一直在努力....

EJB3中JNDI调用SessionBean的解决方案(源码)

标签: EJB JNDI SessionBean 源代码
 
上面三篇文章已经介绍了EJB3中JNDI调用SessionBean的初步解决方案,该部分主要是该解决方案中用到的源代码。
JNDIUtil.java
Java代码
  1. public class JNDIUtil {   
  2.   
  3.     private static Log log = LogFactory.getLog(JNDIUtil.class);   
  4.   
  5.     @SuppressWarnings("unchecked")   
  6.     public static Object lookup(Class clazz) throws NamingException {   
  7.         ComponentInfo c = getAnnotation(clazz);   
  8.         String componentName = "jndi";   
  9.         if (c != null) {   
  10.             componentName = c.name();   
  11.         }   
  12.         InputStream is = clazz.getClassLoader().getResourceAsStream(   
  13.                 "jndi/" + componentName + ".properties");   
  14.         Properties p = new Properties();   
  15.         try {   
  16.             if (is != null) {   
  17.                 p.load(is);   
  18.                 is.close();   
  19.             } else {   
  20.                 log   
  21.                         .debug("没有查找到相应的配置jndi的属性文件,系统将采用默认的基于jboss的本地配置!\n"  
  22.                                 + "如果采取其他的配置,请在classes目录下建立jndi目录并配置相应的属性文件,默认的属性文件为jndi.properties");   
  23.                 getDefaultProp(p);   
  24.             }   
  25.         } catch (IOException e) {   
  26.             e.printStackTrace();   
  27.             getDefaultProp(p);   
  28.         }   
  29.         InitialContext ctx = new InitialContext(p);   
  30.         JNDIFinder finder = JNDIFactory.getFinder(p.getProperty("server"));   
  31.         return finder.lookup(ctx, clazz);   
  32.     }   
  33.   
  34.     private static void getDefaultProp(Properties p) {   
  35.         p.put(Context.INITIAL_CONTEXT_FACTORY,   
  36.                 "org.jnp.interfaces.NamingContextFactory");   
  37.         p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jpn.interfaces");   
  38.         p.put(Context.PROVIDER_URL, "jnp://localhost:1099");   
  39.     }   
  40.   
  41.     @SuppressWarnings("unchecked")   
  42.     private static ComponentInfo getAnnotation(Class clazz) {   
  43.         if (clazz != null) {   
  44.             ComponentInfo c = (ComponentInfo) clazz   
  45.                     .getAnnotation(ComponentInfo.class);   
  46.             if (c != null) {   
  47.                 return c;   
  48.             } else {   
  49.                 Class[] clas = clazz.getInterfaces();   
  50.                 ComponentInfo cc = null;   
  51.                 for (Class cla : clas) {   
  52.                     cc = getAnnotation(cla);   
  53.                     if (cc != null) {   
  54.                         break;   
  55.                     }   
  56.                 }   
  57.                 return cc;   
  58.             }   
  59.         } else {   
  60.             return null;   
  61.         }   
  62.     }   
  63.   
  64. }  
 
 

JNDIFactory.java

Java代码
  1. public class JNDIFactory {   
  2.     private static Log log = LogFactory.getLog(JNDIFactory.class);   
  3.     public static JNDIFinder getFinder(String server) {   
  4.         if (JBOSS_SERVER.equals(server)) {   
  5.             log.info("当前应用为jboss的lookup");   
  6.             return new JbossJNDIFinderImpl();   
  7.         } else if (WEBLOGIC_SERVER.equals(server)) {   
  8.             log.info("当前应用为weblogic的lookup");   
  9.             return new WeblogicJNDIFinderImpl();   
  10.         }   
  11.         return new JbossJNDIFinderImpl();// 默认返回jboss的实现   
  12.     }   
  13.     private final static String JBOSS_SERVER = "jboss";// jboss服务器   
  14.     private final static String WEBLOGIC_SERVER = "weblogic";// weblogic服务器   
  15. }  

JNDIFinder.java

Java代码
  1. public interface JNDIFinder {   
  2.     public Object lookup(InitialContext ctx, Class clazz)   
  3.             throws NamingException;   
  4. }   

JbossJNDIFinderImpl.java

Java代码
  1. public class JbossJNDIFinderImpl implements JNDIFinder {   
  2.     public Object lookup(InitialContext ctx, Class clazz)   
  3.             throws NamingException {   
  4.         String s = "remote";   
  5.         Local local = (Local) clazz.getAnnotation(Local.class);   
  6.         if (local != null) {   
  7.             s = "local";   
  8.         }   
  9.         return ctx.lookup(clazz.getSimpleName() + "/" + s);   
  10.     }   
  11.   
  12. }  

WeblogicJNDIFinderImpl.java

Java代码
  1. public class WeblogicJNDIFinderImpl implements JNDIFinder {   
  2.     public Object lookup(InitialContext ctx, Class clazz)   
  3.             throws NamingException {   
  4.         return ctx.lookup(clazz.getSimpleName() + "#" + clazz.getName());   
  5.     }   
  6. }  

ComponentInfo.java

Java代码
  1. @Target( { TYPE })   
  2. @Retention(RetentionPolicy.RUNTIME)   
  3. public @interface ComponentInfo {   
  4.     String name();   
  5.     String description() default "";   
  6. }  

该组件全局的接口:DefaultCoreService.java

Java代码
  1. @ComponentInfo(name = "oecp-core", description = "oecp平台核心组件,提供了整个组件平台运行的环境和相关通用功能")   
  2. public interface DefaultCoreService {   
  3.   
  4. }  

 

附件:


    评分: 请先登录再投票,同一篇博客一月只能投票一次!
    无人投票

评论


发表评论

关注此文的人们还关注