我正在尝试找出使用 JavaConfig(基于注释的配置)在 Spring 4.x 中定义 Remote EJB 3 bean 的最佳方法。
我查看了 <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()
,我本以为 getObject()
应该由 Spring 自动调用。此外,这还意味着为我要加载的每个 Remote EJB 定义工厂,这似乎不对。我本来希望/期望有一种方法可以定义一个可重用的工厂,并为每个 bean 创建传递接口/JNDI 名称,但这不起作用。
spring 文档表明:
此外,对于@Bean 方法,您通常会选择使用 编程式 JNDI 查找:使用 Spring 的 JndiTemplate/JndiLocatorDelegate 助手或直接 JNDI InitialContext 用法,但不是 JndiObjectFactoryBean 变体 将强制您将返回类型声明为 FactoryBean 类型 而不是实际的目标类型,使其更难用于 在打算引用的其他@Bean 方法中交叉引用调用 此处提供的资源。
所以现在我很困惑该怎么办。
SimpleRemoteStatelessSessionProxyFactoryBean
:
简单地定义明确的
/<jee:local-slsb>
查找 提供一致且更明确的 EJB 访问配置。<jee:remote-slsb>
那么我该如何干净地做到这一点?
您不需要显式调用 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;
}
SimpleRemoteStatelessSessionProxyFactoryBean 类和 org.springframework.ejb.access 包在与 spring boot 3 捆绑在一起的 spring 框架 6(spring-context jar)中不存在。有什么替代方案?