【发布时间】:2014-01-20 09:30:11
【问题描述】:
首先是问题,然后是解释:我想摆脱 Beans XML 配置并向我的 EJB 上下文添加一些信息。
我在我的项目(项目的 Web 部分)中有一个名为 StatelessEjbSupportLocal 的类,它扩展了 LocalStatelessSessionProxyFactoryBean,这是实现:
public class StatelessEjbSupportLocal
extends LocalStatelessSessionProxyFactoryBean {
private UserInfo userInfo;
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
FacesContext context = FacesContext.getCurrentInstance();
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jboss.security.jndi.JndiLoginInitialContextFactory");
properties.put(Context.PROVIDER_URL, "jnp://localhost:1099/");
properties.put(Context.SECURITY_PRINCIPAL,
userInfo.getLogin() + ";" + userInfo.getHost());
properties.put(Context.SECURITY_CREDENTIALS, userInfo.getIdUser());
super.setJndiEnvironment(properties);
refreshHome();
}
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
}
我的 apps.xml 上有 bean 配置:
(...)
<context:annotation-config/>
<context:component-scan base-package="my.package.controller" />
<bean id="someBusiness" class="my.package.StatelessEjbSupportLocal">
<property name="jndiName" value="SomeBusinessImpl/local" />
<property name="businessInterface" value="my.package.business.SomeBusiness" />
<property name="userInfo" ref="userInfo" />
</bean>
(...)
我的 web.xml 具有加载上述 xml 的配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:apps.xml</param-value>
</context-param>
我的UserInfo 类使用@Component 进行注释,并在用户登录后填充到我的SecurityFilter(在我的web.xml 中配置为过滤器)。我在那里设置了主机、登录名和 id 并将其放在会话中。
一切正常。我有这个是因为我在 EJB SessionContext 上设置了用户,以便在我的业务(服务)类的拦截器上获取此信息。这样我就不需要将用户信息传递给我的所有业务实现(我需要这个,因为在我的连接上,我使用类似于某种预连接配置的过程将用户信息设置到数据库以达到审计目的)。
我想做的是摆脱apps.xml 上的beans XML 配置。换句话说,此 LocalStatelessSessionProxyFactoryBean 的某种拦截器将设置 UserInfo 而无需在每个 bean 配置上使用 <property name="userInfo" ref="userInfo" />。
因为我可以拥有我的apps.xml:
<context:annotation-config/>
<context:component-scan base-package="my.package.controller" />
我的托管 bean 上的 SomeBusiness 属性用 @Autowired 注释可以正常工作。
如果您需要更多信息,请告诉我,我会用它来编辑这个问题。
提前致谢。
【问题讨论】: