Java 在焊接中使用@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; } 在服务

我有一个部分是JavaEE(服务器端)部分是JavaSE(客户端)的应用程序。由于我希望客户机具有良好的体系结构,所以我在其中使用Weld来注入各种组件。其中一些组件应该是服务器端@EJB

我计划做的是扩展Weld体系结构以提供“组件”,允许Weld在客户端尝试引用EJB实例时执行JNDI查找以加载EJB实例。但是我该怎么做呢

换句话说,我想

在客户端

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完全有可能。。。哦,不!不是上下文: