Angular - Spring: как передать объект file + json в WS?

На угловой стороне я передаю свой объект file + json:

const formData: FormData = new FormData();
formData.append('fabricDTO', JSON.stringify(classToPlain(fabric)));
formData.append('file', picture);
return this.http.Post(this.SAVE_FABRIC_URL, formData)

А на стороне java я пытаюсь получить файл и объект json. У меня есть DTO с такой же структурой:

@RestController
@RequestMapping(value = "fabric")
public class FabricController {

    @Autowired
    IFabricService fabricService;


    @PreAuthorize("#oauth2.hasScope('foo') and #oauth2.hasScope('read')")
    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<Collection<FabricDTO>> getUserFabrics() {
        ...
    }

    @PreAuthorize("#oauth2.hasScope('foo') and #oauth2.hasScope('read')")
    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity saveUserFabrics(@RequestBody FabricDTO fabricDTO, 
            @RequestParam("file") MultipartFile file) {
    ...
    }

}

В конфигурации у меня есть multipartResolver

@Bean(name = "multipartResolver")
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    }

Это то, что я вижу в консоли Chrome в данных формы:

fabricDTO: {"fabricTypeId":4,"comment":"sdf"}
file: (binary)

FabricDTO - это:

private int id;
private float length;
private String comment;
private int fabricTypeId;

Но когда я отправляю вызов WS, я получаю ошибку:

Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundarymeuYlXb7Tsiyovtn;charset=UTF-8' not supported]

Я считаю, что мне не следует использовать @RequestBody для получения DTO, я пробовал с @RequestParam, но все значения DTO равны нулю.

Должен ли я передавать свои данные другим способом?

Если я не добавлю DTO в formData и прокомментирую "@RequestBody FabricDTO fabricDTO" в контроллере, я смогу получить файл.

Спасибо

можешь показать контроллер со всеми аннотациями?

Asanka 03.11.2018 17:23

Да, я отредактировал свой пост

Lempkin 03.11.2018 17:28

в аннотации @RequestMapping (method = RequestMethod.POST) добавьте эту @RequestMapping (method = RequestMethod.POST, consumes = {"multipart / form-data"})

Asanka 03.11.2018 17:31

Ничего не меняется

Lempkin 03.11.2018 17:34
stackoverflow.com/questions/21329426/…, вы можете проверить этот ответ.
Asanka 03.11.2018 17:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
1 131
2

Ответы 2

Попробуйте использовать @Requestpart

@ResponseBody
public ResponseEntity saveUserFabrics(@RequestPart FabricDTO fabricDTO, 
    @RequestPart MultipartFile file) { //Do your magic here }

как это сделали здесь товарищи по SO-e: Можно ли весной использовать multipart и @RequestBody вместе?

Я получил ошибку [org.springframework.web.multipart.support.MissingServletReq‌ uestPartException: Требуемая часть запроса «fabricDTO» отсутствует]. Я видел ветку, но не уверен, как данные отправляются, с помощью formData или еще ...

Lempkin 03.11.2018 17:38

проверьте с помощью @RequestParam ("fabricDTO") FabricDTO fabricDTO вместо @RequestBody FabricDTO fabricDTO

Asanka 03.11.2018 18:11

Используйте класс как

public class FormWrapper {
    private MultipartFile file;
    private FabricDTO fabricDTO;
}

и контроллер как это

@PostMapping()
    public ResponseEntity saveUserFabrics(@ModelAttribute FormWrapper model) {
        try {
           ...
        } catch (IOException e) {
          ...
        }
        return new ResponseEntity("Successfully uploaded!", HttpStatus.OK);
    }

как этот ответ https://stackoverflow.com/a/49991403/6706381

По-прежнему нет: ошибка поля в объекте 'formWrapper' в поле 'fabricDTO': отклоненное значение [{"length": "4", "comment": "hfgh"}]; коды [typeMismatch.formWrapper.fabricDTO, typeMismatch.fabricDTO, t‌ ypeMismatch.com.myAp‌ p.service.dto.Fabric‌ DTO, typeMismatch]; аргументы [org.springframework.context.support.DefaultMessageSourceRes‌ olvable: коды [formWrapper.fabricDTO, fabricDTO]; аргументы []; сообщение по умолчанию [fabricDTO]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'com.myApp.service.dto.FabricDTO' для свойства 'fabricDTO'; вложенное исключение j ...

Lempkin 03.11.2018 19:13

Кажется, что он не ожидает какого-то Json, в указанном вами ответе форма отправляется напрямую, поэтому, возможно, я получил другой результат: /

Lempkin 03.11.2018 19:14

Речь идет о проблеме отображения объектов. Он не может правильно проанализировать объект. Попробуйте использовать слово потребления. надо попробовать разные способы.

Asanka 03.11.2018 19:22

Да, это то, что я сделал, я пробовал все эти решения, а затем я больше не знал, почему я спрашиваю :) (такая же ошибка с потреблением кстати)

Lempkin 03.11.2018 19:26

ваши свойства DTO ткани должны совпадать с объектами внешнего интерфейса (имя и типы)

Asanka 03.11.2018 19:32

Другие вопросы по теме