在没有xml配置的情况下覆盖LocalStatelessSessionProxyFactoryBean

时间:2014-01-02 20:31:10

标签: java spring ejb-3.0

首先是问题,然后是解释:我想摆脱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上设置用户以在我的业务(服务)类上的Interceptor上获取此信息。这样我就不需要将用户信息传递给我的所有业务实现(我需要这个,因为在我的连接上,我将用户信息设置为数据库,其过程类似于某种预连接配置以进行审计)。

我想要做的是摆脱beans上的apps.xml XML配置。换句话说,这个LocalStatelessSessionProxyFactoryBean的某种拦截器将在每个bean配置上设置UserInfo而不需要<property name="userInfo" ref="userInfo" />。 因为我可以将apps.xml改为:

<context:annotation-config/>
<context:component-scan base-package="my.package.controller" />

我使用SomeBusiness注释的托管bean上的@Autowired属性可以正常工作。

如果您需要更多信息,请告诉我,我会用它来编辑这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这不漂亮,我不推荐它。您应该使用@Bean带注释的方法来构造bean或保留XML。

如果您仍想继续此操作,请使用StatelessEjbSupportLocal为您的@Component课程添加注释。使用setUserInfo注释其@Autowired并覆盖setBusinessInterfacesetJndiName方法,使用@Value使用您要使用的值对其进行注释,并调用其超级实现。例如,

@Override
@Value("SomeBusinessImpl/local") // or reference some property
public void setJndiName(String jndiName) {
    super.setJndiName(jndiName);
}

然后在组件扫描中声明包含StatelessEjbSupportLocal的包。

按OP编辑:

Sotirios Delimanolis推荐。我离开了XML配置。