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

xwmevbvl  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(111)

我试图找出在Spring 4.x中使用JavaConfig(基于注解的配置)定义远程EJB 3 bean的最佳方法。
我看了<jee:remote-slsb>的Spring文档,并整合了一个功能配置,但它很糟糕:

@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(),并且我希望getObject()应该被Spring自动调用。此外,这还意味着为我想要加载的每个远程EJB定义工厂,这似乎不正确。我希望/期望一种可以定义可重用工厂的方式,并且只需为每个bean创建传递Interface/JNDI名称,但那没用
Spring文件指出:
此外,对于@Bean方法,您通常会选择使用编程式JNDI查找:使用Spring的JndiTemplate/JndiLocatorDelegate helpers或直接使用JNDI InitialContext,但不是JndiObjectFactoryBean变体,它会强制您将返回类型声明为FactoryBean类型而不是实际的目标类型,这使得它更难用于其他@Bean方法中的交叉引用调用,这些方法旨在引用此处提供的资源。
所以现在我不知道该怎么办了。
EJB Specific spring文档还建议使用SimpleRemoteStatelessSessionProxyFactoryBean
定义显式的<jee:local-slsb>/<jee:remote-slsb>查找只是提供了一致且更显式的EJB访问配置。
那么,我如何干净地做到这一点呢?

qij5mzcb

qij5mzcb1#

您不需要显式调用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;
}

相关问题