Angular - Spring: как передать файл + объект json в WS? - PullRequest
0 голосов
/ 03 ноября 2018

На угловой стороне я передаю свой файл + объект 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 console, в данных формы:

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

FabricDTO - это:

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

Но когда я посылаю вызов WS, я получаю сообщение об ошибке:

Решено [org.springframework.web.HttpMediaTypeNotSupportedException: Тип содержимого 'Многочастному / форм-данных; граница = ---- WebKitFormBoundarymeuYlXb7Tsiyovtn; кодировка = UTF-8' не поддерживается]

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

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

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

Thx

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

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

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

0 голосов
/ 03 ноября 2018

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

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

, как это сделали со-коллеги: Можем ли мы использовать multipart и @RequestBody вместе весной??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...