2017-06-24 7 views
1

SpringデータRESTとHATEOASを利用したSpring Boot 1.5.4アプリケーションでは、カスタムリソースプロセッサとカスタムコントローラ、カスタムリポジトリがあります。残念ながら、@ServiceクラスのコンストラクタインジェクションをMessageSendingOperationsの依存関係に使用すると、カスタムリソースプロセッサが呼び出されなくなりました。カスタムリソース処理を妨げるコンストラクタインジェクション

private final MessageSendingOperations<String> messageTemplate; 

@Autowired 
public ChannelHandler(MessageSendingOperations<String> messageTemplate) { 
    this.messageTemplate = messageTemplate; 
} 

:コンストラクタ・インジェクションを元に戻すことは、すなわちからの復帰、私のカスタムリソースプロセッサの実行を復元

@Autowired 
private MessageSendingOperations<String> messageTemplate; 

nullmessageTemplateその結果、私のカスタムリソースプロセッサを「再できます」。だから、どこかに問題があるのですが、どこに???任意のアイデアをどのようにこれを追跡するには?

答えて

2

messageTemplateは遅延注入されたプロキシですか?例えば:Javadocから

public ChannelHandler(@Lazy MessageSendingOperations<String> messageTemplate) { 
    this.messageTemplate = requireNonNull(messageTemplate, "messageTemplate"); 
} 

コンポーネントの初期化のためにその役割に加えて、このアノテーション もAutowired又は を注入付い注入点上に配置することができる。その意味で、 ObjectFactoryまたはProviderを使用する代わりに、影響を受けるすべての依存関係に対して遅延のある プロキシを作成します。

これは通常、豆の初期化順序に影響します。この場合、ChannelHandlerMessageSendingOperationsより前に初期化されます。 @Lazyがなければ、最初にMessageSendingOperationsが初期化されます。

また、Spring 4.3の場合、@Autowiredは単一引数コンストラクタの場合はno longer requiredです。

+1コンストラクタインジェクションを使用し、finalフィールドを使用します。

+0

+1 - 私はそれを試していませんでした。興味深いことに、 '@ Lazy'コンストラクタの初期化が動作します。つまり、NPEとリソースプロセッサの両方を処理しますが、リソースプロセッサは実行できますが、なぜですか? –

+0

'@ Lazy'は、Beanの初期化の順序を変更するCGLIBプロキシを作成します。 IDEで上のコンストラクタにブレークポイントを設定し、 'messageTemplate'の型を観察するのが簡単な方法です。 – ck1

+0

はい。私はこの作業を行うのになぜ@ @ Lazyが必要なのだろうかと疑問に思っています。つまり、未知の根本原因の回避策のようなにおいがします。 –

関連する問題