Spring boot 接收数组

记录后台接收数组

如果所有参数(包括数组)全部用一个实体类来接收,则不需要考虑前端数组的传参格式,他都能解析并封装到实体类里面。
这里的传参格式指:
后台用一个数组a来接收:

Integer[] a;

前端传值是下面两种的其中一种,都是可以的:
a=1&a=2&a=3 或者 a[0]=1&a[1]=2&a[3]=3


但是,如果直接在controller用数组对象接收的数组。而不是使用实体类来接收数组。那么 需要考虑以下两种情况。

1.前端使用ajax传的数组,并且格式是这样的:
http://192.168.0.143:8091/tourist/goods/a_goods?specValues[]=1&specValues[]=3&specImgs[]=1&specNames[]=1&specNames[]=3

那么,你需要@RequestParam(value = “specValues[]”)。

Controller: (参数前面加上注解 @RequestParam(value = "specValues[]") String[] specValues")

  /**
     * 添加商品
     */
    @ApiOperation(value = "新增商品", notes = "卖家新增商品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userId", value = "卖家用户ID", required = false, dataType = "int", paramType = "query"),
            @ApiImplicitParam(name = "access_token", value = "access_token", required = false, dataType = "String", paramType = "query")
    })
    @RequestMapping(value = "a_goods", method = RequestMethod.POST)
    public HttpEntity addGoods(FlkGoods goods, Integer userId, @RequestParam(value = "specValues[]") String[] specValues, @RequestParam(value = "specImgs[]") String[] specImgs, @RequestParam(value = "specNames[]") String[] specNames, HttpServletRequest request){
        if (specNames == null || specImgs == null || specValues == null) {
            logger.info("商品规格相关数据未传入");
            throw new BusiException(ErrorKey.INVALID_REQUEST, "请完善商品规格!");
        }
        Map<String, Object> returnMap = goodsService.addGoods(goods, userId, specValues, specImgs, specNames);
        return new ResponseEntity<>(returnMap, HttpStatus.OK);
    }

前端传的参数是这样的:
在这里插入图片描述

2.前端使用ajax传的数组,表单序列化,并且格式是这样的:

Controller: (参数前面去掉@RequestParam注解)

  /**
     * 添加商品
     */
    @ApiOperation(value = "新增商品", notes = "卖家新增商品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userId", value = "卖家用户ID", required = false, dataType = "int", paramType = "query"),
            @ApiImplicitParam(name = "access_token", value = "access_token", required = false, dataType = "String", paramType = "query")
    })
    @RequestMapping(value = "a_goods", method = RequestMethod.POST)
    public HttpEntity addGoods(FlkGoods goods, Integer userId, String[] specValues, String[] specImgs, String[] specNames, HttpServletRequest request){
        if (specNames == null || specImgs == null || specValues == null) {
            logger.info("商品规格相关数据未传入");
            throw new BusiException(ErrorKey.INVALID_REQUEST, "请完善商品规格!");
        }
        Map<String, Object> returnMap = goodsService.addGoods(goods, userId, specValues, specImgs, specNames);
        return new ResponseEntity<>(returnMap, HttpStatus.OK);
    }
http://localhost:8091/tourist/goods/a_goods?goodsName=asfasdf&specValues=11ml%2C12ml%2C13ml&specValues=%E5%A4%A7%2C%E5%B0%8F&specImgs=2.jpg&specNames=%E9%A2%9C%E8%89%B2&specNames=%E5%B0%BA%E7%A0%81

在这里插入图片描述

最后测试发现,使用方式1,通过swagger发送的参数,可以接收到。但是前端用post方式传过来,还是接收不到。查资料查了半天,仍然不知道原因,有知道的朋友,烦请告知我一下。。。万分感激!


结论

最后,我都用的实体类接收数据。

spring boot 接收参数,如果参数多,且包含了数组,建议直接用一个实体类接收。
RequestGoodsH5.java:

@Data
public class RequestGoodsH5 extends FlkGoods{

    private Integer userId;

    @ApiModelProperty(value = "规格值名称组合")
    private String[] specValues;

    @ApiModelProperty(value = "规格图片组合")
    private String[] specImgs;

    @ApiModelProperty(value = "规格名称组合")
    private String[] specNames;
    
    /**
     * 其他更多参数
     */
}

controller:

   /**
     * 添加商品
     */
    @ApiOperation(value = "新增商品", notes = "卖家新增商品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userId", value = "卖家用户ID", required = false, dataType = "int", paramType = "query"),
            @ApiImplicitParam(name = "access_token", value = "access_token", required = false, dataType = "String", paramType = "query")
    })
    @RequestMapping(value = "a_goods", method = RequestMethod.POST)
    public HttpEntity addGoods(RequestGoodsH5 goods){
        if (goods.getSpecValues() == null || goods.getSpecImgs() == null || goods.getSpecNames() == null) {
            logger.info("商品规格相关数据未传入");
            throw new BusiException(ErrorKey.INVALID_REQUEST, "请完善商品规格!");
        }
        FlkGoods goodsReal = new FlkGoods();
        BeanUtil.copyPropertiesIgnoreNullValue(goods, goodsReal);
        Map<String, Object> returnMap = goodsService.addGoods(goodsReal, goods.getUserId(), goods.getSpecValues(), goods.getSpecImgs(), goods.getSpecNames());
        return new ResponseEntity<>(returnMap, HttpStatus.OK);
    }

通过一个实体类来接收,前端数组传这两种形式(a=1&a=2&a=3 或者 a[0]=1&a[1]=2&a[3]=3),spring boot 都可以把前端传过来的值封装到对应的参数里面。

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,我可以回答这个问题。Spring Boot 可以通过使用 MultipartFile 类型的参数接收文件。例如,可以在控制器方法中使用 @RequestParam 注解来接收文件参数,如下所示: ``` @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { // 处理文件上传逻辑 return "上传成功"; } ``` 在上面的代码中,我们使用 @PostMapping 注解来指定处理 POST 请求的方法,使用 @RequestParam 注解来指定接收的文件参数名为 "file",并将其绑定到 MultipartFile 类型的 file 参数中。在方法中,我们可以编写处理文件上传的逻辑,最后返回上传成功的消息。 希望这个回答能够帮助到你。 ### 回答2: 在Spring Boot中,可以使用MultipartFile类来接收文件。这个类是Spring框架提供的,用于处理文件上传的封装类。接收文件的过程可以通过以下步骤完成: 首先,需要在Controller中定义一个接口,用来接收文件。可以使用@RequestParam注解来指定接收文件的参数名,并将参数类型设置为MultipartFile。例如: ```java @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { // 处理文件上传逻辑 return "成功接收到文件:" + file.getOriginalFilename(); } ``` 在上述例子中,文件参数名为"file",文件上传成功后,会返回一个包含文件名的成功信息。 在接口中,我们可以用MultipartFile对象获取文件的各种信息,例如原始文件名、文件大小、文件内容等。可以使用以下方法: - file.getOriginalFilename():获取文件的原始名称。 - file.getSize():获取文件的大小。 - file.getBytes():获取文件的内容字节数组接收文件后,可以进行一些文件处理的操作,例如将文件保存到本地磁盘或存储到数据库中等。 需要注意的是,在进行文件上传时,还需要设置正确的请求头以及文件大小限制等。这些可以在application.properties或application.yml中进行配置。例如: ```yaml spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 上述例子中,限制了上传文件的最大大小为10MB。 总结起来,通过使用MultipartFile类,结合@RequestParam注解,我们可以轻松实现Spring Boot接收文件的功能。在接收文件后,可以进行一些后续的文件处理操作。需要注意配置文件上传的一些限制,以保证安全和性能。 ### 回答3: 使用Spring Boot接收文件可以通过以下步骤完成: 1. 配置文件上传的最大限制:在application.properties中添加以下配置,设置文件上传的最大大小限制。 ``` spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` 2. 创建Controller类:创建一个Controller类,用于接收文件上传的请求。 ```java @RestController public class FileUploadController { @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { // 处理上传的文件 // 文件可以通过file.getInputStream()获取,也可以通过file.getBytes()获取字节数组 // 返回上传成功的消息 return "File uploaded successfully."; } } ``` 3. 启用文件上传:在应用的启动类上添加`@EnableMultipart`注解,启用文件上传功能。 ```java @SpringBootApplication @EnableMultipart public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 4. 创建文件上传表单:在前端页面中创建一个表单,用于上传文件。 ```html <form method="POST" action="/upload" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="Upload" /> </form> ``` 这样,当用户选择文件并点击“上传”按钮时,文件将被发送到`/upload`接口,然后在Controller类中使用`@RequestParam("file")`注解接收文件。可以在该方法中处理文件(如保存到磁盘、处理文件内容等),然后返回上传成功的消息给用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值