すべてのプロダクト
Search
ドキュメントセンター

Function Compute:Java ハンドラ

最終更新日:Mar 01, 2026

ハンドラは、Function Compute (FC) 関数への受信リクエストを処理します。関数が呼び出されると、FC は関数構成で指定されたハンドラにリクエストをルーティングします。

説明

HTTP トリガーまたはカスタムドメイン名による HTTP リクエストの処理については、「HTTP トリガーを使用した関数の呼び出し」をご参照ください。

ハンドラ形式

次のフォーマットを使用して、Function Compute コンソール[Handler] パラメーターを設定します。

[パッケージ名].[クラス名]::[メソッド名]

たとえば、パッケージが example、クラスが HelloFC、メソッドが handleRequest の場合、次のようになります。

example.HelloFC::handleRequest

パッケージ名とクラス名はカスタマイズできますが、関数の構成にある[ハンドラー]の値と一致している必要があります。「イベント関数を作成する」をご参照ください。

ハンドラー インターフェイス

Java ハンドラは、fc-java-core ライブラリのインターフェイスを実装する必要があります。

インターフェイス入力/出力使用ケース
StreamRequestHandlerInputStream / OutputStream生のバイトストリーム、または POJO にマッピングされないデータを処理する場合
PojoRequestHandler<I, O>カスタム POJO 型Java オブジェクトにマッピングされる構造化された JSON データを操作する場合

Maven 依存関係

fc-java-corepom.xml に追加します。

<dependency>
    <groupId>com.aliyun.fc.runtime</groupId>
    <artifactId>fc-java-core</artifactId>
    <version>1.4.1</version>
</dependency>

最新バージョンについては、Maven リポジトリをご確認ください。

関数を作成する前に、コードと fc-java-core 依存関係を JAR ファイルにパッケージ化します。「コードパッケージのコンパイルとデプロイ」をご参照ください。

StreamRequestHandler

StreamRequestHandlerInputStream から入力を読み取り、OutputStream に出力を書き込みます。

package example;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class HelloFC implements StreamRequestHandler {

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        outputStream.write(new String("hello world").getBytes());
    }
}
  • inputStream: 関数が呼び出されたときに渡されるイベントデータが含まれます。

  • outputStream: 関数の戻りデータを受け取ります。

  • context: リクエスト ID や一時的な AccessKey ペアなどのランタイム情報を提供します。型: com.aliyun.fc.runtime.Context。「Context」をご参照ください。

PojoRequestHandler

PojoRequestHandler<I, O> は、入力と出力にジェネリック型を使用します。両方の型は、JSON シリアル化をサポートする Plain Old Java Object (POJO) である必要があります。

ハンドラクラス

// HelloFC.java
package example;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;

public class HelloFC implements PojoRequestHandler<SimpleRequest, SimpleResponse> {

    @Override
    public SimpleResponse handleRequest(SimpleRequest request, Context context) {
        String message = "Hello, " + request.getFirstName() + " " + request.getLastName();
        return new SimpleResponse(message);
    }
}

リクエストおよび応答クラス

// SimpleRequest.java
package example;

public class SimpleRequest {
    String firstName;
    String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public SimpleRequest() {}
    public SimpleRequest(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
// SimpleResponse.java
package example;

public class SimpleResponse {
    String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public SimpleResponse() {}
    public SimpleResponse(String message) {
        this.message = message;
    }
}

入力イベントの例

{
  "firstName": "FC",
  "lastName": "aliyun"
}

例: HTTP トリガーを使用した関数の呼び出し

この例では、HTTP トリガーリクエストを処理し、HTTP 応答を返すハンドラを示します。

前提条件

開始する前に、次のことを確認してください。

  • 以下のサンプルコードを使用して、Java ランタイムで関数が作成されていること。「イベント関数の作成」をご参照ください。

  • 関数に対して HTTP トリガーが構成されていること。「HTTP トリガーの構成」をご参照ください。

サンプルコード

ハンドラは、入力型と出力型として HTTPTriggerEventHTTPTriggerResponse を使用して PojoRequestHandler を実装します。HTTP トリガーリクエストおよび応答形式については、「HTTP トリガーを使用した関数の呼び出し」をご参照ください。

App.java - エントリクラス

App.java

package example;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;

public class App implements PojoRequestHandler<HTTPTriggerEvent, HTTPTriggerResponse> {

    @Override
    public HTTPTriggerResponse handleRequest(HTTPTriggerEvent request, Context context) {
        context.getLogger().info("Receive HTTP Trigger request: " + request.toString());
        String requestBody = request.getBody();
        if (request.isIsBase64Encoded()) {
            requestBody = new String(java.util.Base64.getDecoder().decode(request.getBody()), StandardCharsets.UTF_8);
        }
        String message = "HTTP Trigger request body: " + requestBody;
        context.getLogger().info(message);
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "text/plain");
        return HTTPTriggerResponse.builder().withStatusCode(200).withHeaders(headers).withBody(request.getBody())
                .withIsBase64Encoded(request.isIsBase64Encoded()).build();
    }
}

HTTPTriggerEvent.java - リクエスト形式

HTTPTriggerEvent.java

package example;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(setterPrefix = "with")
public class HTTPTriggerResponse {
    private int statusCode;
    private Map<String, String> headers;

    @JsonProperty("isBase64Encoded")
    private boolean IsBase64Encoded;
    private String body;
}

HTTPTriggerResponse.java - 応答形式

HTTPTriggerResponse.java

package example;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Map;

import com.fasterxml.jackson.annotation.JsonProperty;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(setterPrefix = "with")
public class HTTPTriggerResponse {
    private int statusCode;
    private Map<String, String> headers;

    @JsonProperty("isBase64Encoded")
    private boolean IsBase64Encoded;
    private String body;
}

追加の Maven 依存関係

fc-java-core とともに jackson および lombok を追加します。

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.16.1</version>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.30</version>
</dependency>

関数の呼び出し

  1. Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. トップナビゲーションバーで、リージョンを選択します。[関数] ページで、管理する関数をクリックします。

  3. トリガー」タブをクリックして、HTTP トリガーのパブリックエンドポイントを取得します。

  4. 次の curl コマンドを実行します。URL を HTTP トリガーのパブリックエンドポイントに置き換えます。期待される応答は次のとおりです。

       curl -i "https://dev-jav-test-fc-luiqas****.cn-shanghai.fcapp.run" -d 'hello fc3.0'
       HTTP/1.1 200 OK
       Content-Disposition: attachment
       Content-Length: 11
       Content-Type: application/json
       X-Fc-Request-Id: 1-652503f2-afbfd2b1dc4dd0fcb0230959
       Date: Tue, 10 Oct 2023 07:57:38 GMT
    
       hello fc3.0%
重要
  • HTTP トリガーの [認証方法][認証なし] に設定されている場合、Postman または curl を使用して関数を直接呼び出します。

  • [認証方式][署名認証] または [JWT 認証] に設定されている場合は、対応する認証方式を使用してください。詳細については、「認証」をご参照ください。

一般的なエラー

このハンドラは、HTTP トリガーの呼び出し用に設計されています。コンソールで [テスト機能] ボタンを使用してプレーンな文字列 ("Hello, FC!" など) で呼び出すと、デシリアライズエラーが発生します:

{
    "errorType": "com.fasterxml.jackson.databind.exc.MismatchedInputException",
    "errorMessage": "Cannot construct instance of `example.HTTPTriggerEvent` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('Hello, FC!')\n at [Source: (byte[])\"\"Hello, FC!\"\"; line: 1, column: 1]",
    "stackTrace": [
        "com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)",
        "com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1588)",
        "..."
    ]
}

このハンドラをテストするには、HTTP トリガーエンドポイントを介して呼び出すか、HTTPTriggerEvent 構造に一致する JSON ペイロードを提供します。

サンプルプログラム

FC は、さまざまなハンドラ型を示すサンプルプログラムを提供しています。