gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:36:22 24 4
gpt4 key购买 nike

我正在尝试找出使用 JavaConfig(基于注解的配置)在 Spring 4.x 中定义 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();
}

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

spring docs表明:

Also, with @Bean methods, you will typically choose to use programmatic JNDI lookups: either using Spring’s JndiTemplate/JndiLocatorDelegate helpers or straight JNDI InitialContext usage, but not the JndiObjectFactoryBean variant which would force you to declare the return type as the FactoryBean type instead of the actual target type, making it harder to use for cross-reference calls in other @Bean methods that intend to refer to the provided resource here.

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

EJB Specific spring docs还建议使用 SimpleRemoteStatelessSessionProxyFactoryBean :

Defining explicit <jee:local-slsb> / <jee:remote-slsb> lookups simply provides consistent and more explicit EJB access configuration.

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

最佳答案

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

关于java - 如何使用基于注释的配置在 Spring 中定义远程 EJB Bean(即 : JavaConfig),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37818227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com