1

バックグラウンド:

Java セキュリティを使用したプログラム認証 (基本認証) を使用しています。ステートレス セッション Bean (EJB 3) があります。Sessioncontext を挿入してセキュリティ プリンシパルを取得し、ユーザー名を取得できます。同じプロジェクトで、JDBC と Aspect に Spring Bean を使用しています。Spring Beanでもあるアスペクト(Audit)の1つでユーザー名を取得したい。

質問:

Spring Bean で ejb セッションコンテキストにアクセスすることは可能ですか。もしそうなら、それを行う方法は?いいえの場合、アスペクトでもあるSpring Beanからユーザー名にアクセスするにはどうすればよいですか。

ありがとう、アミット

4

2 に答える 2

2

これは、EJB を Spring Bean に注入することで実行できます。手動の JNDI ルックアップ (他の EJB クライアントと同様) を介して行うか、Spring の JndiObjectFactoryBean を使用できます。Spring の JndiObjectFactoryBean の場合:

  1. SessionContextをEJB に注入する

    @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

コロッサスさん、返信ありがとうございます。私が見つけた別の方法があります。以下は、以前の投稿へのリンクです。基本的に私はまったく同じことをしました:1) spring-context xmlに次の行を追加しました

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

2)EJBのセッションコンテキストにアクセスするために、私のSpring Beanに次の行を追加しました

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

重要なことは、Jboss 7.1 は Jboss 5 とは異なりカスタム jndi をサポートしていないため、デフォルトの jndi を使用したことです。

これは、私の要件に対処するためのよりクリーンな方法だと思います。

于 2013-03-28T17:53:01.610 に答える