На угловой стороне я передаю свой объект 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" в контроллере, я смогу получить файл.
Спасибо
Да, я отредактировал свой пост
в аннотации @RequestMapping (method = RequestMethod.POST) добавьте эту @RequestMapping (method = RequestMethod.POST, consumes = {"multipart / form-data"})
Ничего не меняется



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте использовать @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 или еще ...
проверьте с помощью @RequestParam ("fabricDTO") FabricDTO fabricDTO вместо @RequestBody FabricDTO fabricDTO
Используйте класс как
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 ...
Кажется, что он не ожидает какого-то Json, в указанном вами ответе форма отправляется напрямую, поэтому, возможно, я получил другой результат: /
Речь идет о проблеме отображения объектов. Он не может правильно проанализировать объект. Попробуйте использовать слово потребления. надо попробовать разные способы.
Да, это то, что я сделал, я пробовал все эти решения, а затем я больше не знал, почему я спрашиваю :) (такая же ошибка с потреблением кстати)
ваши свойства DTO ткани должны совпадать с объектами внешнего интерфейса (имя и типы)
можешь показать контроллер со всеми аннотациями?