Java 在焊接中使用@EJB作为注入注释
我有一个部分是JavaEE(服务器端)部分是JavaSE(客户端)的应用程序。由于我希望客户机具有良好的体系结构,所以我在其中使用Weld来注入各种组件。其中一些组件应该是服务器端@EJB 我计划做的是扩展Weld体系结构以提供“组件”,允许Weld在客户端尝试引用EJB实例时执行JNDI查找以加载EJB实例。但是我该怎么做呢 换句话说,我想 在客户端Java 在焊接中使用@EJB作为注入注释,java,cdi,jboss-weld,Java,Cdi,Jboss Weld,我有一个部分是JavaEE(服务器端)部分是JavaSE(客户端)的应用程序。由于我希望客户机具有良好的体系结构,所以我在其中使用Weld来注入各种组件。其中一些组件应该是服务器端@EJB 我计划做的是扩展Weld体系结构以提供“组件”,允许Weld在客户端尝试引用EJB实例时执行JNDI查找以加载EJB实例。但是我该怎么做呢 换句话说,我想 在客户端 public class ClientCode { public @Inject @EJB MyEJBInterface; } 在服务
public class ClientCode {
public @Inject @EJB MyEJBInterface;
}
在服务器端
@Stateless
public class MyEJB implements MyEJBInterface {
}
当创建ClientCode对象时,Weld“隐式”执行JNDI查找。我该怎么做呢?CDI规范的第3.5节应该会有所帮助。您可能还想在EJB注释上使用一些属性。另外,(可能不需要告诉您这一点)确保您在客户机上正确设置了JNDI以引用服务器,并将任何需要的接口打包到您的客户机jar中。CDI规范的第3.5节应该会有所帮助。您可能还想在EJB注释上使用一些属性。另外,(可能不需要告诉您这一点)确保您在客户机上正确设置了JNDI以引用服务器,并将任何需要的接口打包到客户机jar中。基本上,这样做需要编写一个所谓的JNDI 但是,由于它相当长,需要一些调整,让我进一步解释一下 便携式分机 正如weld doc所解释的,第一步是创建一个实现标记接口的类,在该类中编写与感兴趣的CDI事件对应的代码。在这种情况下,在我看来,最有趣的事情是。事实上,这个事件发生在CDIMPL找到所有“本地”bean之后 因此,编写扩展就是为该事件编写一个处理程序:
public void loadJndiBeansFromServer(
@Observes AfterBeanDiscovery beanDiscovery, BeanManager beanManager)
throws NamingException, ClassNotFoundException, IOException {
// Due to my inability to navigate in server JNDI naming (a weird issue in Glassfish naming)
// This props maps interface class to JNDI name for its server-side
Properties interfacesToNames = extractInterfacesToNames();
// JNDI properties
Properties jndiProperties = new Properties();
Context context = new InitialContext();
for (Entry<?, ?> entry : interfacesToNames.entrySet()) {
String interfaceName = entry.getKey().toString();
Class<?> interfaceClass = Class.forName(interfaceName);
String jndiName = entry.getValue().toString();
Bean<?> jndiBean = createJndIBeanFor(beanManager, interfaceClass, jndiName, jndiProperties);
beanDiscovery.addBean(jndiBean);
}
}
就这些
用法?
现在,在我的glassfish java客户端代码中,我可以编写如下内容
private @Inject @JndiClient MyRemoteEJB instance;
而且它工作起来没有任何问题
未来?
现在,用户凭证是不受管理的,但我想使用CDI:context的C完全有可能。。。哦,不!不是上下文: 基本上,这样做需要写一个所谓的 但是,由于它相当长,需要一些调整,让我进一步解释一下 便携式分机 正如weld doc所解释的,第一步是创建一个实现标记接口的类,在该类中编写与感兴趣的CDI事件对应的代码。在这种情况下,在我看来,最有趣的事情是。事实上,这个事件发生在CDIMPL找到所有“本地”bean之后 因此,编写扩展就是为该事件编写一个处理程序:
public void loadJndiBeansFromServer(
@Observes AfterBeanDiscovery beanDiscovery, BeanManager beanManager)
throws NamingException, ClassNotFoundException, IOException {
// Due to my inability to navigate in server JNDI naming (a weird issue in Glassfish naming)
// This props maps interface class to JNDI name for its server-side
Properties interfacesToNames = extractInterfacesToNames();
// JNDI properties
Properties jndiProperties = new Properties();
Context context = new InitialContext();
for (Entry<?, ?> entry : interfacesToNames.entrySet()) {
String interfaceName = entry.getKey().toString();
Class<?> interfaceClass = Class.forName(interfaceName);
String jndiName = entry.getValue().toString();
Bean<?> jndiBean = createJndIBeanFor(beanManager, interfaceClass, jndiName, jndiProperties);
beanDiscovery.addBean(jndiBean);
}
}
就这些
用法?
现在,在我的glassfish java客户端代码中,我可以编写如下内容
private @Inject @JndiClient MyRemoteEJB instance;
而且它工作起来没有任何问题
未来?
现在,用户凭证是不受管理的,但我想使用CDI:context的C完全有可能。。。哦,不!不是上下文: