当前位置: 首页 > 知识库问答 >
问题:

如何定义一个控制器方法来接受媒体类型为Spring Boot的JSON?

上官英哲
2023-03-14

我试图从前端获取一个Json对象。这代表了一个过程。课程有一个现场徽标,即课程的图像。在我的控制器中,我有以下方法:

@PostMapping(value="/register-course", consumes = "multipart/form-data" )
    html" target="_blank">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);
        }

在服务层中,我有压缩(在DB中放置图像时)和取消压缩(在将图像渲染回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());
}

当我通过POSTMAN将带有徽标字段的JSON作为图像文件发送时,我得到415错误-未支持的媒体类型。

我错在哪里?我想我需要更换我的控制器,但如何更换呢?我需要从JSON with MultipartFile类中获取图像?

更新:我在正文中发送了JSON和一个文件,我认为这就是问题所在。我需要在控制器中放入MultipartFile。

我已经跟随其他答案,仍然有415个错误。在邮递员中,我离开了内容类型,没有任何价值。

共有1个答案

司空镜
2023-03-14

对我来说,我是如何做类似的事情的:在后端(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中(带有axios用于超文本传输协议请求):

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

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

  // etc

请查看图片以供参考:

“课程”模式:

 类似资料:
  • 在我的控制器中,我有一个用以下映射映射的方法:@PostMapping(“/”)。 此方法需要一个我试图捕获的请求主体,如下所述: 使用这两种方法对我来说都很好,我只是进退两难,如果直接在实体类中接受请求体是一个好主意和最佳实践的话。 我不想在controller类中公开我的实体类,因为我不确定这是否是一个好主意。 java 这两种方法都给出了相同的结果,更多的是关注要遵循的最佳实践。

  • 问题内容: 在Python中,该类充当所有(新样式)类的根超类。至少默认情况下,将和应用于的任何子类的“类实例”会产生相同的结果: 我想定义一个的子类,例如,它在每种方式上都是相同的,除了对自身和产生不同的输出: 有没有办法在Python中做到这一点? PS:我知道特殊的方法,但是据我了解,如果类重写,则仅当在的实例上调用时才调用覆盖方法,而不是在自身上调用时。即: 问题答案: 实际上,与对象实例

  • 问题内容: 使用SceneBuilder。我有2个阶段,每个阶段都有一个控制器: , 。 Stage1Controller: Stage2Controller: 这是使用2种方法 (称为in 方法)将这两个fxml文件加载到Main.java类中的方式: 该方法在第一阶段中用作方法,它在两个阶段都转换视图。 如何输入方法?谢谢 问题答案: “快速又脏”的方法是给的引用: 现在在您的主应用程序中:

  • 我在我的web.xml中打开了Jersey JSON POJOsMappingFeature特性,如下所示,以便在POJO和JSON之间进行转换: 我在其中一个控制器中有一个处理文件上传的方法。它接受多部分表单数据,从表单中提取文件输入字段,将其转换为InputStream并将文件保存到磁盘: 这适用于所有文件格式,除非我尝试上传JSON文件,formFile.getValueAs(InputSt

  • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta

  • 我正在使用JavaFX8开发一个Java8桌面应用程序。 我在MainApp类(扩展application类的类)中有这个方法。 我会这样使用它: 有什么方法可以实现这种行为吗?