Как определить метод контроллера, принимающий JSON, у которого есть тип мультимедиа, зарегистрированный с помощью Spring Boot?

Я пытаюсь взять объект Json из интерфейса. Это представляет собой курс. У курса есть полевая эмблема, изображение курса. В моем контроллере у меня есть следующий метод:

@PostMapping(value="/register-course", consumes = "multipart/form-data" )
    public Response courseCreated(@RequestBody @Valid CourseCreatedRequest courseCreatedRequest, @RequestPart(value = "logo") MultipartFile file) throws IOException {
        return Response.ok().setPayload(registerCours(courseCreatedRequest, file));
    }

        private CourseDto registerCours(CourseCreatedRequest courseCreatedRequest, MultipartFile file) throws
        IOException {
            CourseDto courseDto = new CourseDto()
                    .setCourseName(courseCreatedRequest.getCourseName())
                    .setCourseDescription(courseCreatedRequest.getCourseDescription())
                    .setCoursePrice(courseCreatedRequest.getCoursePrice())
                    .setIsCourseActive(courseCreatedRequest.getIsCourseActive())
                    .setIsCourseFree(courseCreatedRequest.getIsCourseFree())
                    .setLogo(file.getBytes());

            return courseService.createNewCourse(courseDto);
        }

На уровне обслуживания у меня есть логика для сжатия (при сохранении изображения в БД) и распаковки (при рендеринге изображения обратно в fend):

@PrePersist
public CourseDto createNewCourse(CourseDto newCourseDto) {

    Courses course = courseRepositoryDao.findByCourseName(newCourseDto.getCourseName());
    if (course == null) {

        course = new Courses()
                .setCourseName(newCourseDto.getCourseName())
                .setCourseDescription(newCourseDto.getCourseDescription())
                .setCoursePrice(newCourseDto.getCoursePrice())
                .setIsCourseFree(newCourseDto.getIsCourseFree())
                .setIsCourseActive(newCourseDto.getIsCourseActive())
                .setLogo(compressZLib(newCourseDto.getLogo()))
        ;
        return CourseMapper.toUserDtoFreeCourses(courseRepositoryDao.save(course));
    }
    throw exception(EntityType.NEWCOURSE, ExceptionType.DUPLICATE_ENTITY, newCourseDto.getCourseName());
}

Когда я отправляю JSON с полем логотипа в виде файла изображения через POSTMAN, я получаю ошибку 415 - неподдерживаемый тип носителя.

Где я не прав? Я думаю, что мне нужно сменить контроллер, но как? Мне нужно как-то взять изображение из JSON с классом MultipartFile?

Обновление: я отправил JSON и файл в теле, и я думаю, что это проблема. Мне нужно поместить MultipartFile в контроллер.

У меня есть другие ответы и все еще ошибка 415. В почтальоне я оставил Content-Type без значения.


person byte is 8bits    schedule 13.05.2021    source источник
comment
аннотирования аргумента courseCreatedRequest с помощью @RequestBody достаточно для привязки данных JSON, отправленных от клиентов.   -  person sanjeevRm    schedule 13.05.2021
comment
да, но я отправил JSON и файл в теле, и я думаю, что это проблема. Мне нужно поместить MultipartFile в контроллер.   -  person byte is 8bits    schedule 13.05.2021
comment
Пожалуйста, проверьте это: stackoverflow.com/questions / 54575893 /   -  person Alexandros Kourtis    schedule 14.05.2021
comment
Вы можете показать нам код внешнего интерфейса?   -  person Alexandros Kourtis    schedule 14.05.2021
comment
Отвечает ли это на ваш вопрос? Spring Boot - Multipart - Неподдерживаемый тип носителя   -  person Triet Doan    schedule 14.05.2021
comment
@ Ужасный пират Алекс, мне плевать. Я тестировал с Postman.   -  person byte is 8bits    schedule 14.05.2021
comment
Вы добавили в контроллер consumes = multipart / form-data? Также проверьте это: stackoverflow.com/questions/52818107/   -  person Alexandros Kourtis    schedule 14.05.2021
comment
@Dread Pirate Alex, я добавил и все равно ошибка 415.   -  person byte is 8bits    schedule 14.05.2021
comment
@Triet Doan, да, это помогает. Это была часть ответа. Ткс!   -  person byte is 8bits    schedule 15.05.2021


Ответы (1)


Для меня то, как я сделал что-то подобное, было таким: В конце (Spring):

@PostMapping(path = "/{your-route-goes-here}", consumes = "multipart/form-data")
public Course addCourse(@RequestPart(required = false, name = "file") MultipartFile file,  @RequestPart("course") Course course) {

    // do stuff here
}

Во внешнем javascript (с аксиомами для http-запроса):

   const course = {
      "property": "value"
   }

  const formData = new FormData();
  formData.append("file", file);
  formData.append("course", course);
  
  axios
    .post("/your-route-goes-here", formData)

  // etc

Пожалуйста, проверьте изображения для справки:

серверная часть:  введите описание изображения здесь

почтальон:  введите описание изображения здесь

модель "Курс":

введите описание изображения здесь

person Alexandros Kourtis    schedule 13.05.2021
comment
@ byteis8bits работает ?? - person Alexandros Kourtis; 14.05.2021
comment
нет это dosent :(. дает тот же 415 - person byte is 8bits; 14.05.2021
comment
можно скриншоты почтальона прислать? тело и заголовки ... Также есть ли у CourseCreatedRequest конструктор по умолчанию ?? - person Alexandros Kourtis; 14.05.2021
comment
Это работает, как вы сказали, но с небольшой разницей. Я поместил столбец CONTENT TYPE multipart / form-data в строку файла. И это работает так. Ткс! - person byte is 8bits; 14.05.2021
comment
:)) Удачи с вашим проектом ???????? - person Alexandros Kourtis; 15.05.2021
comment
Спасибо, братан! Поддерживать связь! - person byte is 8bits; 15.05.2021