前端传对象数组到后台List进行类型转换

很多情况下,后端需要从前端接受数据进行处理,这里写到几种接收数据的方法:

/**
 * 根据多个id获取之前上传的数据,这里接受List需要使用RequestParam注解,否则会报异常
 * 如果传递的是对象,则需要使用@RequestBody List<Bean> bean,来进行接收
 */
@ApiOperation("根据id获取之前上传的数据,需要传ids")
@PostMapping("/getBeanById")
public Result getFileById(@RequestParam(value ="ids") List<String> ids, HttpServletRequest request, HttpServletResponse response){
    Map map = Maps.newHashMap();
    for(String id : ids){
        String url = fileGetService.openlist(id);
        map.put(id, url);
    }
    return Result.success("获取数据成功", map);
}



/**
 * 保存
 */
@ApiOperation("保存信息")
@ApiImplicitParam(name = "teams", value = "jsonArray('格式':'JSONArray')",  dataType = "String")
@PostMapping("/add")
public Result add(@RequestParam("teams") String teams){
    // 第一种方式
    JSONArray jsonArray= JSON.parseArray(teams);
    List<Team> str = jsonArray.toJavaList(Team.class);
    
    // 第二种方式
    List<Team>  str = JSON.parseArray(teams, Team.class);
    
    // 处理其他业务......
}



// mapper.xml可以这样写
<insert id="insertXtTeamManagelist"  useGeneratedKeys="true" keyProperty="id">
    insert into team
    <trim prefix="(" suffix=")" suffixOverrides=",">
        create_by,
        del_flag,
        remarks
    </trim>
    values
    <foreach collection="Team" item="item" index="index"
             separator=",">
        (
        #{item.createBy},
        #{item.delFlag},
        #{item.remarks}
        )
    </foreach>
</insert>


 

<think>好的,用户问的是前端过来的数组Java后端怎么接收。首先,我需要回忆一下常见的参方式和对应的处理方式。通常前端数组可以通过URL参数、表单数据、JSON请求体等方式,后端要根据不同的情况使用不同的方法来接收。 首先想到的是GET请求中的数组,比如查询参数用逗号分隔或者重复的键。这时候后端可以用@RequestParam来接收,比如List<String>或者String[]。不过要注意,如果前端是用逗号分隔的,可能需要手动分割字符串,或者配置Spring的换器。 然后是POST请求的表单数据,这时候同样可以用@RequestParam,但如果是application/x-www-form-urlencoded格式,处理方式应该和GET类似。不过如果是多选框之类的表单字段,参数名相同,Spring会自动绑定到数组或集合。 接下来是JSON格式的请求体,这时候前端的是JSON数组,后端需要用@RequestBody来接收,比如List或者自定义的对象列表。这时候需要确保请求的Content-Type是application/json,并且配置了像Jackson这样的库来处理反序列化。 另外,可能用户对路径变量中的数组也有疑问,比如URL中的某个路径段是数组,但这种情况较少见,可能需要自定义换器,或者将数组编码成字符串再在后台解析。 还要考虑一些特殊情况,比如前端使用不同的分隔符,或者嵌套的对象数组。这时候可能需要自定义解析逻辑,或者使用DTO对象来接收复杂的结构。 此外,可能需要提醒用户注意参数名称的一致性,以及后端接收时使用的注解是否正确。比如@RequestParam用于查询参数或表单数据,而@RequestBody用于请求体中的JSON数据。 另外,安全性和验证也是需要考虑的,比如确保接收的数组元素符合预期,防止注入攻击或者非法数据。可以使用JSR-303验证注解,或者在业务逻辑中进行检查。 可能用户在使用过程中遇到了类型不匹配的问题,比如前端的是字符串数组,而后端用Integer列表接收,这时候会抛出异常,需要确保类型一致性。 最后,总结一下各种方法,给出示例代码,并推荐最佳实践,比如使用JSON格式和@RequestBody,这样更符合RESTful风格,并且处理复杂数据结构更灵活。</think>在Java后端接收前端递的数组时,具体实现方式取决于 **前端参格式** 和 **HTTP请求类型**。以下是常见场景及对应的解决方案: --- ### **1. GET请求:URL参数数组** #### **场景** 前端通过URL拼接参数,例如: ```url /api/data?ids=1&ids=2&ids=3 ``` 或 ```url /api/data?ids=1,2,3 ``` #### **后端接收方式** - **方式1:直接接收为数组** ```java @GetMapping("/data") public ResponseEntity<?> getData(@RequestParam("ids") Integer[] ids) { // 直接操作数组 ids return ResponseEntity.ok(ids); } ``` - **方式2:接收为集合** ```java @GetMapping("/data") public ResponseEntity<?> getData(@RequestParam("ids") List<Integer> ids) { // 操作List集合 ids return ResponseEntity.ok(ids); } ``` #### **注意事项** - 若前端用逗号分隔(如 `ids=1,2,3`),需手动分割字符串: ```java @RequestParam("ids") String idsStr List<Integer> ids = Arrays.stream(idsStr.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); ``` --- ### **2. POST请求:表单数据数组** #### **场景** 前端通过表单提交(如多选框): ```html <form> <input type="checkbox" name="tags" value="java"> <input type="checkbox" name="tags" value="python"> </form> ``` #### **后端接收方式** ```java @PostMapping("/submit") public ResponseEntity<?> submitForm(@RequestParam("tags") List<String> tags) { // 接收List集合 tags return ResponseEntity.ok(tags); } ``` --- ### **3. POST请求:JSON格式数组** #### **场景** 前端通过JSON请求体数组: ```json { "names": ["Alice", "Bob", "Charlie"] } ``` #### **后端接收方式** - **方式1:直接绑定到集合** ```java @PostMapping("/users") public ResponseEntity<?> addUsers(@RequestBody Map<String, List<String>> request) { List<String> names = request.get("names"); return ResponseEntity.ok(names); } ``` - **方式2:通过DTO对象封装**(推荐) ```java public class UserRequest { private List<String> names; // Getter & Setter } @PostMapping("/users") public ResponseEntity<?> addUsers(@RequestBody UserRequest userRequest) { List<String> names = userRequest.getNames(); return ResponseEntity.ok(names); } ``` --- ### **4. 路径变量数组(较少用)** #### **场景** URL路径中包含数组: ```url /api/data/1,2,3 ``` #### **后端接收方式** ```java @GetMapping("/data/{ids}") public ResponseEntity<?> getData(@PathVariable String ids) { List<Integer> idList = Arrays.stream(ids.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); return ResponseEntity.ok(idList); } ``` --- ### **5. 复杂嵌套数组(JSON对象数组)** #### **场景** 前端对象数组: ```json { "users": [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"} ] } ``` #### **后端接收方式** ```java public class UserDTO { private Integer id; private String name; // Getter & Setter } public class UserListRequest { private List<UserDTO> users; // Getter & Setter } @PostMapping("/users") public ResponseEntity<?> addUsers(@RequestBody UserListRequest request) { List<UserDTO> users = request.getUsers(); return ResponseEntity.ok(users); } ``` --- ### **关键注意事项** 1. **Content-Type匹配** - 表单数据:`application/x-www-form-urlencoded` 或 `multipart/form-data` - JSON数据:`application/json` 2. **类型转换安全** - 若前端递字符串而字段声明为 `Integer`,需确保内容可换,否则抛出 `NumberFormatException`。 3. **推荐方案** - **简单数组**:优先使用 `@RequestParam` + 集合或数组 - **复杂数据**:使用 `@RequestBody` + DTO对象 --- ### **总结** | 参方式 | 后端接收方法 | 适用场景 | |-------------------|----------------------------------|-----------------------| | URL参数 | `@RequestParam` + 数组/集合 | 简单过滤条件 | | 表单数据 | `@RequestParam` + 集合 | 多选框、多选列表 | | JSON请求体 | `@RequestBody` + DTO封装 | 复杂对象或嵌套结构 | | 路径变量 | `@PathVariable` + 手动解析 | 少量简单参数 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值