1
resposta

[Bug] [Java] MULTIPARTFILE Open Feign Spring boot

Boa tarde, estou com problema para enviar requisição MultifilePart de uma api para outra pelo FeignClient, basicamente eu tenho um endpoint q recebe um arquivo MultifilePart envia para a API B recebendo tambem um MultifilePart

API A:
    Controller:
     @PostMapping
        public void uploadJustificativa(@RequestParam("file") MultipartFile file) throws IOException {
                String response = minio.upload(file);
        }

Feign client:
     @PostMapping(value = "/file/upload2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,headers = "Content-Type=multipart/form-data")
        String upload(@RequestPart("file") MultipartFile file);

API B:
Controller:
    @PostMapping(value = "/file/upload2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadFile2(@RequestParam("file") MultipartFile file)throws Exception {
        uploadFile(arquivo,"arquivo", 2);
        return "File uploaded successfully";
    }

Na api B ja recebo a exception Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/json' is not supported], não consigo fazer ele enviar o content type multipart/form-data mesmo setando nos headers e não consigo debuggar pois nem consegue entrar no método da controller.

meu spring boot usa essa versão: org.springframework.boot spring-boot-starter-parent 3.1.3

e usa o java 17.

se puder me me ajudar a entender o que estou errando, agradeço imensamente!

1 resposta

Oi Fabio, boa tarde! Tudo joia?

Esse problema pode ser causado por algumas configurações ou detalhes que estão faltando. Vou tentar ajudar com algumas sugestões.

Primeiro, certifique-se de que você tem as dependências necessárias no seu pom.xml para trabalhar com Feign e MultipartFile. Aqui está um exemplo:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Além disso, você pode precisar adicionar uma configuração Feign específica para suportar MultipartFile. Aqui está um exemplo de como fazer isso:

import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {
    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder();
    }
}

Depois, certifique-se de que seu FeignClient esteja configurado para usar essa configuração:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;

@FeignClient(name = "apiBClient", url = "http://localhost:8081", configuration = FeignConfig.class)
public interface ApiBClient {
    @PostMapping(value = "/file/upload2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String upload(@RequestPart("file") MultipartFile file);
}

No seu controlador da API A, você pode usar o FeignClient da seguinte forma:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class FileUploadController {

    @Autowired
    private ApiBClient apiBClient;

    @PostMapping("/upload")
    public void uploadJustificativa(@RequestParam("file") MultipartFile file) throws IOException {
        String response = apiBClient.upload(file);
        System.out.println(response);
    }
}

Certifique-se também de que o endpoint da API B está corretamente configurado para receber o arquivo:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FileUploadControllerB {

    @PostMapping(value = "/file/upload2", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadFile2(@RequestParam("file") MultipartFile file) throws Exception {
        // Lógica para processar o arquivo
        return "File uploaded successfully";
    }
}

Espero que isso ajude a resolver o seu problema!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.