Todos los productos
Search
Centro de documentos

Function Compute:Java handlers

Última actualización: Sep 06, 2026

Un controlador de Java procesa los eventos entrantes en su función de Function Compute (FC). FC enruta cada invocación al método de controlador especificado en la configuración de su función.

Nota

Para invocar funciones mediante activadores HTTP o nombres de dominio personalizados, Use an HTTP trigger to invoke a function.

Formato del controlador

Establezca el parámetro Handler en la consola de Function Compute con a continuación formato:

[Package name].[Class name]::[Method name]

Por ejemplo, si su paquete es example, su clase es HelloFC y su método es handleRequest:

example.HelloFC::handleRequest

Los nombres del paquete y de la clase son personalizables, pero deben coincidir con el valor de Handler en la configuración de su función. Create an event function.

Interfaces del controlador

Los controladores de Java deben implementar una interfaz de la biblioteca fc-java-core:

Interfaz

Entrada/Salida

Cuándo usarla

StreamRequestHandler

InputStream / OutputStream

Para procesar flujos de bytes sin procesar o datos que no se asignan a un POJO

PojoRequestHandler<I, O>

Tipos POJO personalizados

Recomendada cuando trabaja con datos JSON estructurados que se asignan a objetos de Java

Dependencia de Maven

Agregue fc-java-core a su archivo pom.xml:

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

Consulte el repositorio de Maven para obtener la versión más reciente.

Antes de crear una función, empaquete su código y la dependencia fc-java-core en un archivo JAR. Compile and deploy code packages.

StreamRequestHandler

StreamRequestHandler lee la entrada desde un InputStream y escribe la salida en un 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**: contiene los datos del evento que se pasan al invocar la función.

  • **outputStream**: recibe los datos de retorno de la función.

  • **context**: proporciona información de tiempo de ejecución, como el ID de solicitud y el par de accesskey temporal. Tipo: com.aliyun.fc.runtime.Context. Context.

PojoRequestHandler

PojoRequestHandler<I, O> utiliza tipos genéricos para la entrada y la salida. Ambos deben ser POJO compatibles con la serialización JSON.

Clase del controlador

// 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);
    }
}

Clases de solicitud y respuesta

// 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;
    }
}

Ejemplo de evento de entrada

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

Ejemplo: invocar una función con un activador HTTP

Este ejemplo muestra cómo gestionar solicitudes de activadores HTTP y devolver respuestas.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

Código de ejemplo

El controlador utiliza PojoRequestHandler con HTTPTriggerEvent y HTTPTriggerResponse como tipos de entrada y salida. Para conocer los formatos de solicitud y respuesta, consulte Use an HTTP trigger to invoke a function.

App.java: clase de entrada

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: formato de solicitud

HTTPTriggerEvent.java

package example;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Map;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(setterPrefix = "with")
public class HTTPTriggerEvent {
    private String version;
    private String rawPath;
    private Map<String, String> headers;
    private Map<String, String> queryParameters;
    private RequestContext requestContext;

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

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder(setterPrefix = "with")
    public static class RequestContext {
        private String accountId;
        private String domainName;
        private String domainPrefix;
        private HttpInfo http;
        private String requestId;
        private String time;
        private String timeEpoch;

        @Data
        @NoArgsConstructor
        @AllArgsConstructor
        @Builder(setterPrefix = "with")
        public static class HttpInfo {
            private String method;
            private String path;
            private String protocol;
            private String sourceIp;
            private String userAgent;
        }
    }

}

HTTPTriggerResponse.java: formato de respuesta

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;
}

Dependencias adicionales de Maven

Agregue jackson y lombok junto con fc-java-core:

<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>

Invocar la función

  1. Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, haga clic en Functions.

  2. En la barra de navegación superior, seleccione una región. En la página Functions, haga clic en la función de destino.

  3. Haga clic en la pestaña Triggers para obtener el endpoint público del activador HTTP.

  4. Ejecute a continuación comando de curl. Reemplace la URL por el endpoint público de su activador:

       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%
Importante
  • Si Authentication Method está establecido en No Authentication, invoque la función directamente con Postman o curl.

  • Si Authentication Method es Signature Authentication o JWT Authentication, aplique la autenticación correspondiente. Authentication.

Errores comunes

Este controlador espera la entrada de un activador HTTP. Si lo invoca mediante el botón Test Function con una cadena simple (como "Hello, FC!"), se genera un error de deserialización:

{
    "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)",
        "..."
    ]
}

Para probar este controlador, invóquelo a través del endpoint del activador HTTP o proporcione una carga útil JSON que coincida con la estructura de HTTPTriggerEvent.

Programas de ejemplo

A continuación se muestran programas de ejemplo para distintos tipos de controladores: