当前位置: 代码网 > it编程>编程语言>Java > java抽奖项目之奖品上传中传递参数类型的错误解决

java抽奖项目之奖品上传中传递参数类型的错误解决

2026年09月10日 Java 我要评论
问题导入:测试后端接口代码:使用createprizeparam类来接收param参数,前端应该传递 application\json 字符串。/** * 创建奖品 * request

问题导入:

测试后端接口代码:

使用createprizeparam类来接收param参数,前端应该传递 application\json 字符串。 

/**
     * 创建奖品
     * requestparam:用于接收表单数据的 multipart/form-data
     *
     * @param param
     * @param prizepic
     * @return
     */
    @requestmapping("/prize/create")
    public commonresult<long> createprize(@valid @requestpart("param") createprizeparam param,
                                          @requestpart("prizepic") multipartfile prizepic) {
        log.info("createprize createprizeparam:{}",
                jacksonutil.writervalueasstring(param));
        return commonresult.success(prizeservice.createprize(param, prizepic));
    }

postman发起http请求成功,后端失败。

网页显示创建奖品失败:undefined

一、不设定param参数后面的content-type

使用postman来测试,因为浏览器无法设置单个参数的 content-type。在 form-data 表单中把param参数使用json字符串格式构造完成,prizepic 传递成功。

发起请求之后:http请求成功,但是显示 content-type 的类型为 application/octet-stream 类型导致请求失败,后端报错信息,也是显示 content-type 类型错误。

12:16:41 [http-nio-8080-exec-1] error c.e.l.c.h.globalexceptionadvice - 服务异常: org.springframework.web.httpmediatypenotsupportedexception: content-type 'application/octet-stream' is not supported

浏览器中项目前端页面显示创建奖品失败:undefind 未定义,后端服务器错误信息和上面的服务器异常一样。

12:16:41 [http-nio-8080-exec-1] error c.e.l.c.h.globalexceptionadvice - 服务异常: org.springframework.web.httpmediatypenotsupportedexception: content-type 'application/octet-stream' is not supported

二、在postman上的content-type上强制application/json

在 postman 上的 content-type 上强制 application/json 传递成功。因为 prizepic 是一个文件,所以不能设定它的类型为application/json

所以我们就确定了是 param 参数传递的时候 content-type 的问题。

三、后端使用string 来接收参数,再使用jacakson工具转化为对应类

但是浏览器无法这样只给param参数设置 content-type 类型为 application/json 所以对前端很不友好。所以我们修改后端接口,让接收 json 字符串自动构造成对象的修改为 string 类型来接收一个字符串。

这样就可以让 form-data 中不设定param的 content-type 类型,让它默认为 application/octet-stream 后端接收到 json 字符串,之后通过这个字符串来构造成 createprizeparam 对象了。

这是后端代码

/**
     * 创建奖品
     * requestparam:用于接收表单数据的 multipart/form-data
     *
     * @param param
     * @param prizepic
     * @return
     */
    @requestmapping("/prize/create")
    public commonresult<long> createprize(@valid @requestpart("param") string param,
                                          @requestpart("prizepic") multipartfile prizepic) {
        log.info("createprize createprizeparam:{}",
                param);
        createprizeparam param1 = jacksonutil.readvalue(param, createprizeparam.class);
        return commonresult.success(prizeservice.createprize(param1, prizepic));
    }

使用postman 测试成功

浏览器页面也成功

最后总结:

我使用的是springboot4.1.0,在奖品创建的时候parampostman上把json字符串构造成功后,在返回类型content-type这一栏里面需要加上application\json 这个类型,但是浏览器不支持这种写法

解决方案:1.psotman可以使用,但是在param传参数的一栏中的 content-type 这个填上 application\json 表示这一栏返回的是json

2.后端修改,把createprizeparam param类换成字符串来接收参数,接收到字符串后使用jacksong工具转化为createprizeparam 传递给 service 层来保证正常。

package com.example.lotterysystem.controller;
 
import com.example.lotterysystem.common.pojo.commonresult;
import com.example.lotterysystem.common.utils.jacksonutil;
import com.example.lotterysystem.controller.param.createprizeparam;
import com.example.lotterysystem.service.pictureservice;
import com.example.lotterysystem.service.prizeservice;
import jakarta.annotation.resource;
import jakarta.validation.valid;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.multipartfile;
 
@restcontroller
//@slf4j
public class prizecontroller {
 
    private static final logger log = (logger) loggerfactory.getlogger(prizecontroller.class);
//    private static final logger logger = loggerfactory.getlogger(prizecontroller.class);
    @autowired
    private pictureservice pictureservice;
    @resource(name = "prizeserviceimpl")
    private prizeservice prizeservice;
 
    @requestmapping("/pic/upload")
    public string uploadpic(multipartfile file) {
        return pictureservice.savepicture(file);
    }
 
    /**
     * 创建奖品
     * requestparam:用于接收表单数据的 multipart/form-data
     *
     * @param param
     * @param prizepic
     * @return
     */
    @requestmapping("/prize/create")
    public commonresult<long> createprize(@valid @requestpart("param") string param,
                                          @requestpart("prizepic") multipartfile prizepic) {
        log.info("createprize createprizeparam:{}",
                param);
        createprizeparam param1 = jacksonutil.readvalue(param, createprizeparam.class);
        return commonresult.success(prizeservice.createprize(param1, prizepic));
    }
 
}

到此这篇关于java抽奖项目之奖品上传中传递参数类型的错误解决的文章就介绍到这了,更多相关java奖品上传传递参数类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com