【发布时间】: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