如何使用基于注释的配置在Spring中定义远程EJB Bean(即:JavaConfig)

时间:2016-06-14 17:09:05

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

我试图找出使用JavaConfig(基于注释的配置)在Spring 4.x中定义远程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访问配置。

那我该如何干净利落呢?

1 个答案:

答案 0 :(得分: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;
}