【问题标题】:How to define Remote EJBs Beans in Spring using annotation-based configuration (ie: JavaConfig)如何在 Spring 中使用基于注解的配置定义远程 EJB Bean(即:JavaConfig)
【发布时间】:2016-10-15 13:16:06
【问题描述】:

我正在尝试找出在 Spring 4.x 中使用 JavaConfig(基于注释的配置)定义 Remote EJB 3 bean 的最佳方法。

我查看了Spring Docs for <jee:remote-slsb> 并编写了一个功能配置,但这很糟糕:

@Bean
public LoginManager getLoginManager(){
    SimpleRemoteStatelessSessionProxyFactoryBean factory = new SimpleRemoteStatelessSessionProxyFactoryBean();
    String beanName = "jndi.ejb3.LoginManager";
    factory.setJndiName(beanName);
    factory.setBusinessInterface(LoginManager.class);
    Properties p = new Properties();
    p.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory" );
    p.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces" );
    p.setProperty("java.naming.provider.url", "jnp:localhost:1099");
    factory.setJndiEnvironment(p);
    try {
        factory.afterPropertiesSet();
    } catch (NamingException e1) {
        e1.printStackTrace();
    }
    return (LoginManager) factory.getObject();
}

我不应该在 bean 定义中调用 afterPropertiesSet(),并且我希望 Spring 应该自动调用 getObject()。此外,它还意味着为我要加载的每个远程 EJB 定义工厂,这似乎不正确。我本来希望/期望有一种方法可以定义一个可重用的工厂,并将每个 bean 创建的接口/JNDI 名称传递给它,但这不起作用。

spring docs 表示:

此外,对于 @Bean 方法,您通常会选择使用 程序化 JNDI 查找:使用 Spring 的 JndiTemplate/JndiLocatorDelegate 助手或直接 JNDI InitialContext 用法,但不是 JndiObjectFactoryBean 变体 将强制您将返回类型声明为 FactoryBean 类型 而不是实际的目标类型,使其更难用于 打算引用的其他 @Bean 方法中的交叉引用调用 此处提供的资源。

所以现在我很困惑该怎么做。

EJB Specific spring docs 也推荐使用SimpleRemoteStatelessSessionProxyFactoryBean

简单地定义显式 <jee:local-slsb> / <jee:remote-slsb> 查找 提供一致且更明确的 EJB 访问配置。

那么我该如何干净地做到这一点呢?

【问题讨论】:

    标签: java spring jakarta-ee ejb spring-java-config


    【解决方案1】:

    您不需要显式调用 afterProperties 方法,因为这是 Spring bean 生命周期的一部分。此外,如果您将 bean 声明为工厂 bean,spring 将在需要时自动使用 getObject 获取真实对象。这是修改后的代码

        @Bean
    public FactoryBean getLoginManagerFactory(){
        SimpleRemoteStatelessSessionProxyFactoryBean factory = new SimpleRemoteStatelessSessionProxyFactoryBean();
        String beanName = "jndi.ejb3.LoginManager";
        factory.setJndiName(beanName);
        factory.setBusinessInterface(LoginManager.class);
        Properties p = new Properties();
        p.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory" );
        p.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces" );
        p.setProperty("java.naming.provider.url", "jnp:localhost:1099");
        factory.setJndiEnvironment(p);
    return factory;
    }
    

    【讨论】:

    • 此外,如果您想将其外部化,您可以注入您的属性。
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 2015-03-25
    • 2012-05-25
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多