カテゴリ: Micronaut 更新日: 2026/02/23

MicronautでHTTPクライアントにAOPを適用する方法を解説

MicronautでHTTPクライアントにAOPを適用する方法を解説
MicronautでHTTPクライアントにAOPを適用する方法を解説

先生と生徒の会話形式で理解しよう

生徒

「MicronautのHTTPクライアントにAOPを適用して、リクエスト前後に処理を追加することはできますか?」

先生

「はい、MicronautではHTTPクライアントのインターフェースにAOPアノテーションを付けることで、リクエスト送信前やレスポンス受信後にInterceptorを挟むことができます。」

生徒

「具体的にはどのように設定すればよいですか?」

先生

「順を追って実例を見ながら説明します。HTTP通信の前後でログや監査、共通処理を自動化する方法です。」

1. HTTPクライアントインターフェースを作成

1. HTTPクライアントインターフェースを作成
1. HTTPクライアントインターフェースを作成

まず、MicronautのHTTPクライアントインターフェースを定義します。@Clientアノテーションを付与することで、指定したURLのAPIと通信するクライアントが自動生成されます。


import io.micronaut.http.annotation.Get;
import io.micronaut.http.client.annotation.Client;

@Client("https://jsonplaceholder.typicode.com")
public interface PostClient {

    @Get("/posts/{id}")
    String getPost(Long id);
}

2. 独自AOPアノテーションの作成

2. 独自AOPアノテーションの作成
2. 独自AOPアノテーションの作成

次にHTTPクライアントに適用する独自AOPアノテーションを作成します。@AroundでInterceptorクラスを指定し、通信の前後に処理を挟むことができます。


import io.micronaut.aop.Around;
import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
@Around(HttpClientInterceptor.class)
public @interface TimedHttp {
}

3. Interceptorクラスの作成

3. Interceptorクラスの作成
3. Interceptorクラスの作成

InterceptorクラスではMethodInterceptorを実装し、context.proceed()の前後に独自処理を追加します。ここでは通信前後のログ出力や処理時間計測を行う例を示します。


import io.micronaut.aop.MethodInterceptor;
import io.micronaut.aop.MethodInvocationContext;
import jakarta.inject.Singleton;

@Singleton
public class HttpClientInterceptor implements MethodInterceptor<Object, Object> {

    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {
        System.out.println("HTTPリクエスト送信前: " + context.getMethodName());
        long start = System.currentTimeMillis();
        Object result = context.proceed();
        long end = System.currentTimeMillis();
        System.out.println("HTTPリクエスト完了: " + context.getMethodName() + " 実行時間: " + (end - start) + "ms");
        return result;
    }
}

4. クライアントメソッドへのAOP適用

4. クライアントメソッドへのAOP適用
4. クライアントメソッドへのAOP適用

作成した@TimedHttpアノテーションをHTTPクライアントのメソッドに付与します。Interceptorが自動的に実行され、通信前後に処理が挟まれます。


@Client("https://jsonplaceholder.typicode.com")
public interface PostClient {

    @TimedHttp
    @Get("/posts/{id}")
    String getPost(Long id);
}

5. BeanとInterceptorの連携

5. BeanとInterceptorの連携
5. BeanとInterceptorの連携

Interceptor内では他のBeanを@Injectで注入することも可能です。例えば、共通のLoggingServiceやMetricsServiceを注入して、HTTP通信のモニタリングや監査ログを一元管理できます。


import jakarta.inject.Singleton;
import jakarta.inject.Inject;

@Singleton
public class LoggingService {
    public void log(String message) {
        System.out.println("ログ: " + message);
    }
}

@Singleton
public class HttpClientInterceptorWithBean implements MethodInterceptor<Object, Object> {

    @Inject
    private LoggingService loggingService;

    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {
        loggingService.log("HTTP通信開始: " + context.getMethodName());
        Object result = context.proceed();
        loggingService.log("HTTP通信完了: " + context.getMethodName());
        return result;
    }
}

6. 複数Interceptorの組み合わせ

6. 複数Interceptorの組み合わせ
6. 複数Interceptorの組み合わせ

HTTPクライアントには複数のInterceptorを組み合わせることができます。例えば、タイミング計測用のInterceptorとセキュリティ検証用のInterceptorを同じメソッドに適用し、順序に従って処理を実行できます。


@TimedHttp
@SecurityCheck
@Get("/posts/{id}")
String getPost(Long id);

7. 実務での活用ポイント

7. 実務での活用ポイント
7. 実務での活用ポイント

HTTPクライアントにAOPを適用すると、通信の前後での共通処理が簡単に追加できます。ログ、監査、エラーハンドリング、リトライ処理などをInterceptorで一元化することで、コードの保守性が向上し、プロジェクト全体で統一した動作が実現できます。

カテゴリの一覧へ
新着記事
New1
Quarkus
Quarkus拡張開発をマスター!ビルドプロセスの仕組みと内部構造を徹底解説
New2
Micronaut
Micronautの@Factoryとは?複雑なBean生成を管理するための方法を解説
New3
Quarkus
QuarkusのDIとCDIを完全理解!@Producesでプロデューサーメソッドを使う方法を初心者向けに解説
New4
Java
JavaのStringBufferクラスを徹底解説!スレッド安全な文字列操作の仕組みと使い分け
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.2
Java&Spring記事人気No2
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.3
Java&Spring記事人気No3
Micronaut
Micronautのルーティング設定ガイド!プレフィックス付与とAPIバージョニングの基本
No.4
Java&Spring記事人気No4
Quarkus
QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
No.5
Java&Spring記事人気No5
Micronaut
Micronautのフィルタ徹底解説!HTTPリクエスト共通処理をスマートに追加する方法
No.6
Java&Spring記事人気No6
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.7
Java&Spring記事人気No7
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?
No.8
Java&Spring記事人気No8
Quarkus
Quarkus拡張開発を徹底解説!仕組みから自作エクステンションの作り方まで