有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Springbeans中的JavaEJB3会话上下文

背景:

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

问题:

可以在Springbean中访问ejb SessionContext吗。如果是这样,怎么做? 如果不是,那么如何从Springbean访问用户名,这也是一个方面

谢谢, 阿米特


共 (2) 个答案

  1. # 1 楼答案

    科洛索斯,谢谢你的回复。 我可以找到另一种方法。以下是指向previous post的链接。所以基本上我做了完全相同的事情: 1) 在spring上下文xml中添加了以下行

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

    2)在MySpringbean中添加了以下行以访问EJB的会话上下文

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

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

    我认为这是一种更简洁的方式来满足我的需求

  2. # 2 楼答案

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

    1. SessionContext注入EJB

      @Resource
      private SessionContext ctxt;
      //getter and setter
      
    2. 在bean配置文件中配置工厂beanpostageService是我们感兴趣的EJBRef(从Apress-Spring配方中挖出的配置)

         <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引用连接到Springbean中

           public class PostalServiceClient{
      
             //wired EJB
             private PostageService service;
             //getter and setter
      
             private SessionContext retrieveSessionContext(){
                 service.getCtxt(); //get the SessionContext from the EJB injection
             }
      
            }