[BUG] MultipartFile mapping issue with Spring Boot 3 and binary media types

Ouverte
#1,516 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
42/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
aws, java, spring-boot
Domaine
api, backend, cloud

Piste de recherche

Commencez par la configuration affichée de LambdaHandler et StageAwareAwsProxyHttpServletRequestReader, puis suivez la manière dont aws-serverless-java-container-springboot3 transmet la requête multipart et le type de contenu image/jpeg à Spring Boot. Reproduisez l’envoi via API Gateway/Lambda et vérifiez que le contrôleur lie l’image à MultipartFile sans renvoyer d’erreur 415.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Description:

I am encountering an issue when trying to upload images from my client to a Spring Boot 3 application deployed as a Lambda function using aws-serverless-java-container-springboot3.

Problem:

Despite configuring API Gateway with multipart/form-data as a binary media type, and observing the binary data successfully reaching the Lambda handler, the Spring controller fails to map the incoming request to a MultipartFile argument. Instead, a GlobalException is triggered with the message:

415 UNSUPPORTED_MEDIA_TYPE "Content type 'image/jpeg' not supported for bodyType=org.springframework.web.multipart.MultipartFile"

Setup:

Framework: Spring Boot 3

Serverless Java Container Dependency:

<dependency>
    <groupId>com.amazonaws.serverless</groupId>
    <artifactId>aws-serverless-java-container-springboot3</artifactId>
    <version>2.1.4</version>
</dependency>

LambdaHandler:

package net.myApp.lambda.handler;

import com.amazonaws.serverless.exceptions.ContainerInitializationException;
import com.amazonaws.serverless.proxy.AsyncInitializationWrapper;
import com.amazonaws.serverless.proxy.AwsProxyExceptionHandler;
import com.amazonaws.serverless.proxy.AwsProxySecurityContextWriter;
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
import com.amazonaws.serverless.proxy.spring.SpringBootLambdaContainerHandler;
import com.amazonaws.serverless.proxy.spring.SpringBootProxyHandlerBuilder;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import jakarta.ws.rs.core.MediaType;
import net.myApp.lambda.StageAwareAwsProxyHttpServletRequestReader;
import net.myApp.rest.MyApp;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class LambdaHandler implements RequestStreamHandler {
  private static final Logger logger = LoggerFactory.getLogger(LambdaHandler.class);
  private static SpringBootLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler;

  static {
    try {
      handler =
          new SpringBootProxyHandlerBuilder<AwsProxyRequest>()
              .initializationWrapper(new AsyncInitializationWrapper())
              .requestReader(new StageAwareAwsProxyHttpServletRequestReader())
              .responseWriter(new AwsProxyHttpServletResponseWriter())
              .securityContextWriter(new AwsProxySecurityContextWriter())
              .exceptionHandler(new AwsProxyExceptionHandler())
              .requestTypeClass(AwsProxyRequest.class)
              .responseTypeClass(AwsProxyResponse.class)
              .springBootApplication(MyApp.class)
              .buildAndInitialize();
      handler.getContainerConfig().addBinaryContentTypes(MediaType.MULTIPART_FORM_DATA, "image/jpeg", "image/png", "image/jpg");
    } catch (ContainerInitializationException e) {
      logger.error("FATAL: Failed to initialize Spring Boot application container. This will cause cold starts.", e);
      throw new RuntimeException("Could not initialize Spring Boot application", e);
    }
  }

  @Override
  public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
    try {
      handler.proxyStream(input, output, context);
    } catch (Exception ex) {
      logger.error("Error processing Lambda request: {}", ex.getMessage());
      throw ex;
    }
  }
}

API Gateway Configuration: multipart/form-data has been added to the "Binary Media Types" in the API Gateway settings.

Steps Taken (and observations):

Client-side upload: Attempting to upload an image/jpeg file from the client.

API Gateway: Configured multipart/form-data as a binary media type.

Lambda Handler: Logs within the Lambda handler confirm that the binary data is indeed present and being received by the Lambda function.

Spring Controller: The request does not successfully map to a MultipartFile parameter in my Spring controller. Error: The GlobalException handler in my Spring application catches a 415 UNSUPPORTED_MEDIA_TYPE error, specifically stating that image/jpeg is not supported for MultipartFile.

Expected Behavior:

The aws-serverless-java-container should correctly handle the multipart/form-data request, allowing Spring Boot to bind the uploaded file to a MultipartFile object in the controller method.

Actual Behavior:

The request fails with a 415 UNSUPPORTED_MEDIA_TYPE error, indicating that the image/jpeg content type is not being correctly processed for MultipartFile binding within the Spring application, despite the data reaching the Lambda handler as binary.

Possible Cause/Request for Help:

It appears there might be an issue with how aws-serverless-java-container-springboot3 (version 2.1.4) or its underlying dependencies are processing multipart/form-data requests, preventing Spring's MultipartFile resolver from recognizing the incoming binary data as a valid file upload.

Any guidance or a fix for this issue would be greatly appreciated.

Langage dominant
Java
Étoiles
1.6k
Forks
575
Merge moyen
1 j 15 h
PR mergées (30 j)
12

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de aws/serverless-java-container

Toutes les issues de aws/serverless-java-container

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.