2016-05-31 4 views
0

これで少し作業していて、運がなかった。CXFフェーズ宣言がないためにインターセプターフェーズがスキップされる

私はSpring 3.2.9から4.2.6へのアップグレード中です。私の最初のステップはcxf-core 3.1.6にアップグレードすることでした。これはアプリには何の問題もありませんでした。

私は春の依存関係をすべてアップグレードすると、インターセプターの設定に問題が発生しています。ここでは基本だ:

インターセプタ

public class MyInterceptor extends AbstractPhaseInterceptor<Message>{ 

private static final org.slf4j.Logger logger = LoggerFactory.getLogger(MyInterceptor.class); 

public MyInterceptor() { 
    super(Phase.PRE_INVOKE); 
    addAfter(HolderInInterceptor.class.getName()); 
} 

@PostConstruct 
public void display() { 
    logger.warn(this.getPhase()); 
} 


@Override 
public void handleMessage(Message message) throws Fault { 
    .... 

cxfContext.xml

<bean id="contentInInterceptor" class="com.MyInterceptor"> 
</bean> 

<cxf:bus> 
    <cxf:inInterceptors> 
     <ref bean="contentInInterceptor"/> 
    </cxf:inInterceptors> 


</cxf:bus> 

だけでなく、それはweb.xmlに追加されています。走っているときは、インターセプターがpre-invokeのフェーズで作成されたことを示すログに記録された情報が表示されます(私は狂っていないことを確認するためにこれを追加しました)。サービスを呼び出すときしかし、PhaseInterceptorチェーンは位相を宣言していないためインターセプターをスキップします

ログ:

2016年5月31日16:08:28208 [localhostの-startStop-1] [] c.MyInterceptorをWARN - プレ起動

2016年5月31日16:10:14552 [HTTPバイオ-8080-EXEC-1] [] oacpPhaseInterceptorChain WARN - はインターセプタcom.MyInterceptorをスキップ$$ EnhancerBySpringCGLIB $$ 1afa70e1:フェーズ宣言 がありません。

これは、jaxwsサーバー呼び出しをインターセプトしています。繰り返しますが、私が変更したのは、Springの最新バージョンに更新されている問題です。まるでcxfがBeanから決して生成されなかった別のインターセプタを使用しているかのように見えます。

EDIT

私は問題を発見したと考えているが、やはり私はこの問題を修正する修正プログラムをだろうどこか分かりません。 Spring 4プロキシは、プロキシの作成時にコンストラクタを2回コールしません(つまり、コンストラクタを使用して生のBeanを作成しますが、CGLIBによって作成されたBeanのプロキシはコンストラクタを呼び出しません)。これにより、インターセプタのフェーズがNULLになります。

は、私はこれを確認するために、クラスに私の@PostContsruct周りの変更:

2016年6月1日10:36:52829 [

@PostConstruct 
public void display() { 
    logger.warn(this.getPhase()); 
    MyInterceptor myInterceptor = (MyInterceptor) appContext.getBean("contentInInterceptor"); 
    logger.warn("Bean phase is: " + myInterceptor.getPhase()); 
} 

ログは、プロキシの相対豆の作成の段階を示し、ローカルホスト-startStop-1] []はc.MyInterceptorをWARN - プレ起動

2016年6月1日10:36:52839 [ローカルホスト-startStop-1] [] c.MyInterceptorがWARN - 豆相である:ヌル

答えて

0

あなたは、インターセプターがjaxwsサーバー呼び出しをインターセプトしていると言いました。だから私の前提は、それは発信です。

Phase.PRE_INVOKEは、着信メッセージ用です。相のドキュメントについては

http://cxf.apache.org/docs/interceptors.html

+0

ご迷惑をおかけして申し訳ございません。私のアプリはjaxwsサーバーを持っています。私はSoapUIを通してサーバーを呼び出すので、メッセージはインバウンドです。 – slk42089

0

よしを参照してください。送信メッセージ

ためPhase.PRE_STREAMのような他の相を使用して、私は今のところこれを回避する方法を考え出したが、それは最大の実装ではありません。

基本的には、PhaseInterceptorを実装した抽象クラスを作成し、実装されたすべてのメソッドを抽象クラスとして設定しました。

その後、私のインターセプタはそのクラスから拡張され、独自のphase/id/before/after変数を持っていました。 Beanの直接クラスで変数が利用できない場合、SpringのBeanプロキシ設定に問題があるように見えます。少なくともこれは私がこのケースで見つけたものです。

これも最適な解決策であるかどうかは不明ですが、これによりインターセプタが再び機能します。

関連する問題