2017-06-29 20 views
0

私は今後のすべてのプロジェクトで再利用したいフレームワークを作成しています。サブプロジェクトで@ControllerAdviceが定義されていない場合は、フレームワークが自動的に例外処理のためのデフォルトのアドバイスを初期化するようにします。@ControllerAdvice条件をbeanに与える方法は?

public class ExHandler implements IAdvice { 
    ExceptionHandler(Exception.class) 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @ResponseBody 
    public ErrorDTO default(xception e) { 
     return new ErrorDTO(); 
    } 
} 

私は次のように試みたが、動作しません:サブプロジェクトで

@Configuration 
static class MyConfig { 
    @ControllerAdvice 
    @ConditionalOnMissingBean(IAdvice.class) 
    static class AdviceExHandler extends ExHandler { 

    } 
} 

@ControllerAdvice 
public class SubHandler extends ExHandler { 
} 

結果:それは動作しますが。しかし、サブプロジェクトでExHandlerが定義されていない場合、Beanはまったく初期化されません。しかし、なぜ?

Sidenote:エラーハンドリングが例外ハンドラ内のメソッドの順序によって異なるため、複数のControllerAdviceを防止しようとしています。したがって、私は複数のクラスを導入して注文を混乱させたくありません。

答えて

3

@ConditionalOnMissingBean(annotation = ControllerAdvice.class)を使用すると、欠落しているBeanの条件をControllerAdviceアノテーションで設定できます。

@ControllerAdvice 
public abstract class FrameworkAdvice { 
... 
} 

そして、条件付きでそれを設定します。

@Configuration 
@ConditionalOnMissingBean(annotation = ControllerAdvice.class) 
public class FrameworkAdviceConfig { 
    @Bean 
    public FrameworkAdvice frameworkAdvice() { 
     return new FrameworkAdvice() { 
     }; 
    } 
} 

そして、プロジェクト内の別のコントローラのアドバイスがあれば、それが代わりに使用されます。

@ControllerAdvice 
public class CustomAdvice { 
... 
} 
+0

うわー、素晴らしい。注釈に基づいて条件を定義する機能については知らなかった。それは完全に合っている。 – membersound

関連する問題