1

背景:

我正在使用使用 java 安全性的编程身份验证(基本身份验证)。我有一个无状态会话 bean(EJB 3)。我可以注入 Sessioncontext 以获取安全主体,以获取用户名。在同一个项目中,我将 spring bean 用于 JDBC 和 Aspect。我想在其中一个方面(审计)中获取用户名,这也是一个 spring bean。

问题:

是否可以在 Spring bean 中访问 ejb sesssioncontext。如果是这样怎么做?如果没有,如何从 Spring bean 访问用户名,这也是一个方面。

谢谢,阿米特

4

2 回答 2

2

这可以通过将 EJB 注入到 spring bean 中来完成。您可以通过手动 JNDI 查找来完成(就像在任何其他 EJB 客户端中一样)或使用 Spring 的 JndiObjectFactoryBean。使用 Spring 的 JndiObjectFactoryBean:

  1. 注入SessionContextEJB

    @Resource
    private SessionContext ctxt;
    //getter and setter
    
  2. 在 bean 配置文件中配置工厂 bean。postageService成为我们感兴趣的 EJBRef(从Apress Spring Recipes挖来的配置)

       <bean id="postageService class="org.springframework.jndi.JndiObjectFactoryBean">
             <property name="jndiEnvironment">
                <props>
                   <prop key="java.naming.factory.initial">
                        org.apache.openejb.client.RemoteInitialContextFactory
                    </prop>
                   <prop key="java.naming.provider.url">
                         ejbd://localhost:4201
                   </prop>
               </props>
             </property>
            <property name="jndiName" value="PostageServiceBeanRemote"/>
      </bean>
    
  3. 将 ejb 引用连接到你的 spring bean

         public class PostalServiceClient{
    
           //wired EJB
           private PostageService service;
           //getter and setter
    
           private SessionContext retrieveSessionContext(){
               service.getCtxt(); //get the SessionContext from the EJB injection
           }
    
          } 
    
于 2013-03-28T06:42:05.780 回答
1

kolossus,感谢您的回复。我可以找到另一种方法。以下是上一篇文章的链接。所以基本上我做了完全相同的事情:1)将以下行添加到spring-context xml

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
    <property name="alwaysUseJndiLookup" value="true" />
</bean>

2) 在 my spring bean 中添加以下行以访问 EJB 的会话上下文

@Resource(mappedName = "java:global/TopoServices/MessageRestService!com.myrest.MessageRestService")
    private MessageRestService myBean;

重要的是 Jboss 7.1 不再支持自定义 jndi,这与 Jboss 5 不同,所以我使用了默认的 jndi。

我认为这是满足我要求的更清洁的方法。

于 2013-03-28T17:53:01.610 回答