400 w tym wypadku Bad Request, będzie związana z typem danych
consumes = MediaType.MULTIPART_FORM_DATA_VALUE
Jak wygląda obiekt który przesyłasz, mam na myśli od strony backendowej obiekt z @RequestBody MultipartFile (klasa jaka ma reprezentacje, albo encja nie wiem czym to u Ciebie jest)
Bo w kodzie po stronie klienta widzę obiekt "formData", zgodność musi być nie tylko w kwestii pól, ale zgodność musi być na poziomie typu danych tego pola, jeśli np masz encje z polem typu Date, to nie moze to być "stringowa data" zapisana ciągiem. Chyba, że określisz dokładną strukture obiektu " jaki ma być przekazany" wykorzystując do tego jakiś mapper np
https://www.baeldung.com/jackson-object-mapper-tutorial
i implementując odpowiednią serializacje.
Teraz widzę korzystasz z adnotacji @RequestParam o ile prowadzisz to w taki sposób to
1, @ RequestParam
Wartosci przekazywane przez GET LUB POST SA automatycznie mapowane na typ który znajduję się po @RequestParametrze, jeśli nie korzystasz z maperów, na trasie zbierania danych są sprawdzane typy i właściwości obiektu. Przez co każde pole tego obiektu będzie musiało mieć określony typ, a już na starcie prawdopodobnie tak nie jest chyba że korzystasz z zaimplementowanego mappera
2, @ RequestBody
@The RequestBody annotation dane mogą zostać przekazane w postaci json formatu i konwertowane dopiero potem do typu danych który masz w Javie ( tzn tych związanych z parametrem). Co to za różnica? A no taka, że reuqest zostanie zebrany już po stronie kontrolera i dopiero tutaj zacznie się obsługa, a nie jak w poprzednim wypadku - wyrzuci Ci bad Request, ponieważ nie jest wstanie controler wywnioskować czy parametr który przekazujesz jest zgodny z typem który wysyłasz
Spróbuj :
@RequestBody MultipartFile file