LinkedMultiValueMap的说明

本文深入探讨了LinkedMultiValueMap在处理form表单数据时的应用,特别是在键相同但值不同的场景下如何有效存储数据。文章详细解释了LinkedMultiValueMap的各种操作方法,如添加、获取和删除键值对,并通过实例展示了其在实际开发中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、今天写代码遇到存值采用LinkedMultiValueMap的情况。

它应用在form表单数据,

    public static ObjectMapper mapper = new ObjectMapper();

    params = mapper.readValue(formdatas, LinkedMultiValueMap.class);

    //formdatas 是json字符串

2、采用这种方法反序列化的时候,如果json字符串中有相同的key,存的时候值会以数组的方式保存,

  

 添加一个Key对应一个Value的:void add(K, V);
  添加一个Key对应多个Value的:void add(K, List);
  设置一个Key对应一个Value的:void set(K, V);
  设置一个Key对应多个Value的:void set(K, List);
  移除一个Key和它对应的Value:List remove(K);
  清除所有Value的:void clear();
  拿到所有Key的集合:Set keySet();
  拿到所有的值:List values();
  拿到一个Key对应的某个值:V getValue(K, index);
  拿到一个Key对应的所有Value:List getValues(K);
  拿到MultiValueMap的大小:int size();
  判断是否为空MultiValueMap:boolean isEmpty();
  判断是否包含某个Key:boolean containKey(K);


    例如:linkedMultiValueMap.add("name", "t1");
         linkedMultiValueMap.add("name", "t2");
         linkedMultiValueMap.add("name", "t3");
    保存结果为:name[t1, t2, t3]

比如我们在做表单提交的时候,表单数据中可能存在键相同值不同的情况,可以用这种方法存值。

 

 

 

转载于:https://www.cnblogs.com/DiiDii/p/11010893.html

package com.hlsc.DTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.Date; /** * 定时任务DTO * * @author fwj * @date 2025/7/21 */ @Data @Schema(description = "Xxl定时任务传输对象") public class XxlJobDTO { /** * 任务名称 */ @Schema(description = "任务名称") private String jobDesc; /** * 负责人 */ @Schema(description = "负责人") private String author; /** * CRON配置 */ @Schema(description = "CRON配置") private String scheduleConf; /** * 执行器主键ID */ @Schema(description = "执行器主键ID") private final String jobGroup = "1"; /** * 调度类型 */ @Schema(description = "调度类型") private final String scheduleType = "CRON"; /** * 调度过期策略 */ @Schema(description = "调度过期策略") private final String misfireStrategy = "DO_NOTHING"; /** * 执行器路由策略 */ @Schema(description = "执行器路由策略") private final String executorRouteStrategy = "FIRST"; /** * 任务Handler名称 */ @Schema(description = "任务Handler名称") private final String executorHandler = "demoJobHandler"; // /** // * 任务参数 // */ // @Schema(description = "任务参数") // private String executorParam; /** * 阻塞处理策略 */ @Schema(description = "阻塞处理策略") private final String executorBlockStrategy = "SERIAL_EXECUTION"; /** * GLUE类型 */ @Schema(description = "GLUE类型") private final String glueType = "BEAN"; } 化为MultiValueMap<String, String> map = new LinkedMultiValueMap<>();的工具类
最新发布
07-22
<think>根据用户需求,我们需要将XxlJobDTO对象换为LinkedMultiValueMap<String, String>。LinkedMultiValueMap是Spring框架中的一个类,它允许一个键对应多个值,并且保持插入顺序。 步骤: 1. 分析XxlJobDTO的属性,确定需要换哪些字段。 2. 创建一个工具类,提供一个静态方法,接收XxlJobDTO对象,返回LinkedMultiValueMap<String, String>。 3. 在方法中,将XxlJobDTO的每个属性值换为字符串(如果属性不是字符串类型),并放入LinkedMultiValueMap中。注意,一个属性名对应一个值(即使有多个值,也是用同一个键,值用逗号分隔?但根据需求,MultiValueMap允许一个键对应多个值,所以这里我们根据实际需求处理:如果某个属性是一个集合,我们可以拆分成多个值;如果是单个值,就作为单个值放入。但通常XxlJobDTO的属性都是单个值,所以这里我们按单个值处理,每个属性对应一个值(字符串形式))。 注意:由于MultiValueMap<String, String>的每个键可以对应多个值,但XxlJobDTO的属性一般是单值的,所以我们将每个属性作为一个键,其值(换为字符串)作为该键的唯一值(即一个键对应一个值的列表)。如果遇到集合属性,我们可以将集合的每个元素作为值添加到同一个键下。但需要先确认XxlJobDTO是否有集合属性。 假设XxlJobDTO的常见属性(根据xxl-job的常见配置): - jobGroup: int - jobDesc: String - executorRouteStrategy: String - ... 等等 我们需要将这些属性都换为字符串,并放入MultiValueMap中。 实现: 使用Spring的LinkedMultiValueMap,我们可以逐个添加属性。 工具类示例: ```java import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; public class XxlJobDTOConverter { public static MultiValueMap<String, String> convertToMultiValueMap(XxlJobDTO xxlJobDTO) { MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); // 假设XxlJobDTO有以下属性(根据实际情况调整) // 注意:这里使用getter方法获取属性值 params.add("jobGroup", String.valueOf(xxlJobDTO.getJobGroup())); params.add("jobDesc", xxlJobDTO.getJobDesc()); params.add("executorRouteStrategy", xxlJobDTO.getExecutorRouteStrategy()); // 添加其他属性... // 如果属性是对象,需要根据情况换,例如日期可以格式化为字符串 return params; } } ``` 注意:上面的代码假设XxlJobDTO有这些属性,并且有对应的getter方法。实际中需要根据XxlJobDTO的实际属性来编写。 如果属性值为null,我们可以选择不添加,或者添加空字符串。根据业务需求决定。这里我们选择添加空字符串。 优化:为了避免空指针,我们可以使用String.valueOf(),这样即使为null也会换成"null"字符串,或者我们可以进行空值判断,不添加该键。根据实际需求。 例如: ```java if (xxlJobDTO.getJobGroup() != null) { params.add("jobGroup", String.valueOf(xxlJobDTO.getJobGroup())); } ``` 或者使用Optional来处理。 另外,如果属性是复杂对象,可能需要递归换,但通常XxlJobDTO的属性都是基本类型或字符串,所以这里不考虑。 如果用户需要将嵌套对象也换,那么需要更复杂的处理。但根据问题,我们只处理XxlJobDTO的直接属性。 因此,我们给出一个通用的工具类,用户可以根据实际属性进行补充。 完整示例: ```java import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; public class XxlJobDTOConverter { public static MultiValueMap<String, String> toMultiValueMap(XxlJobDTO dto) { MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); // 逐个添加属性 if (dto.getJobGroup() != null) { map.add("jobGroup", String.valueOf(dto.getJobGroup())); } if (dto.getJobDesc() != null) { map.add("jobDesc", dto.getJobDesc()); } if (dto.getAuthor() != null) { map.add("author", dto.getAuthor()); } if (dto.getExecutorRouteStrategy() != null) { map.add("executorRouteStrategy", dto.getExecutorRouteStrategy()); } // 继续添加其他属性... // 例如:executorHandler, executorParam, cron, etc. return map; } } ``` 注意:这里只列举了部分属性,实际使用中需要根据XxlJobDTO类的定义添加所有需要换的属性。 如果属性很多,可以考虑使用反射,但反射会降低性能,且容易出错。所以推荐显式地写出每个字段。 另外,如果属性名和MultiValueMap中的键名不一致,可以在add方法中使用不同的键名。 例如:如果DTO中属性名为executorRouteStrategy,但需要映射的键为route-strategy,则可以: ```java map.add("route-strategy", dto.getExecutorRouteStrategy()); ``` 最后,使用这个工具类: ```java XxlJobDTO jobDTO = new XxlJobDTO(); // 设置属性... MultiValueMap<String, String> params = XxlJobDTOConverter.toMultiValueMap(jobDTO); ``` 这样,我们就实现了将XxlJobDTO对象换为LinkedMultiValueMap的工具类。 相关问题: 1. 如果XxlJobDTO中有嵌套对象,如何换为MultiValueMap? 2. 如何避免在换过程中出现空指针异常? 3. 除了手动添加每个属性,有没有更自动化的方法(如反射)来实现对象到MultiValueMap的换?</think>### Java 将 XxlJobDTO 对象换为 LinkedMultiValueMap 工具类实现 下面是一个完整的工具类实现,用于将 `XxlJobDTO` 对象换为 Spring 框架中的 `LinkedMultiValueMap<String, String>` 结构。该实现考虑了空值处理、类型换和常见业务场景。 ```java import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import java.util.Date; import java.text.SimpleDateFormat; /** * XXL-JOB DTO换工具类 */ public class XxlJobDTOConverter { private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** * 将XxlJobDTO对象换为LinkedMultiValueMap * @param dto XXL-JOB数据传输对象 * @return MultiValueMap结构数据 */ public static MultiValueMap<String, String> convertToMultiValueMap(XxlJobDTO dto) { MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); // 基础属性映射 safeAdd(params, "jobGroup", dto.getJobGroup()); safeAdd(params, "jobDesc", dto.getJobDesc()); safeAdd(params, "author", dto.getAuthor()); safeAdd(params, "executorRouteStrategy", dto.getExecutorRouteStrategy()); safeAdd(params, "executorHandler", dto.getExecutorHandler()); safeAdd(params, "executorParam", dto.getExecutorParam()); safeAdd(params, "executorBlockStrategy", dto.getExecutorBlockStrategy()); safeAdd(params, "glueType", dto.getGlueType()); // 时间类型换 safeAddDate(params, "scheduleConf", dto.getScheduleConf()); safeAddDate(params, "addTime", dto.getAddTime()); safeAddDate(params, "updateTime", dto.getUpdateTime()); // 数字类型换 safeAdd(params, "triggerStatus", dto.getTriggerStatus()); safeAdd(params, "triggerLastTime", dto.getTriggerLastTime()); safeAdd(params, "triggerNextTime", dto.getTriggerNextTime()); return params; } // 通用安全添加方法(处理空值) private static void safeAdd(MultiValueMap<String, String> map, String key, Object value) { if (value != null) { map.add(key, String.valueOf(value)); } else { map.add(key, ""); // 空值处理为空白字符串 } } // 日期类型特殊处理 private static void safeAddDate(MultiValueMap<String, String> map, String key, Date date) { if (date != null) { SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); map.add(key, sdf.format(date)); } else { map.add(key, ""); } } } ``` #### 使用示例 ```java // 创建DTO对象 XxlJobDTO jobDTO = new XxlJobDTO(); jobDTO.setJobGroup(2); jobDTO.setJobDesc("订单处理任务"); jobDTO.setAuthor("admin"); jobDTO.setExecutorHandler("orderHandler"); jobDTO.setAddTime(new Date()); // 换为MultiValueMap MultiValueMap<String, String> params = XxlJobDTOConverter.convertToMultiValueMap(jobDTO); // 使用示例(如发送HTTP请求) restTemplate.postForObject("http://xxl-job-admin/job/add", params, String.class); ``` #### 关键实现说明: 1. **空值安全处理**: - 所有字段均进行空值检查 - 空值换为空字符串而非 `null` - 避免 `NullPointerException` 2. **类型换**: - 数字类型自动字符串 - 日期类型使用统一格式 `yyyy-MM-dd HH:mm:ss` 换 - 支持 XXL-JOB 特有字段(如 `executorRouteStrategy`) 3. **数据结构特点**: - 使用 `LinkedMultiValueMap` 保持字段插入顺序 - 符合 Spring 的 `MultiValueMap` 接口规范 - 支持同一个 key 对应多个值(通过 `add()` 而非 `put()`) 4. **扩展性**: - 通过 `safeAdd` 方法统一处理基本类型 - 通过 `safeAddDate` 特殊处理日期格式 - 新增字段只需在 `convertToMultiValueMap` 中添加映射 > **注意**:实际使用时需根据你的 `XxlJobDTO` 类定义调整字段映射。如果 DTO 中包含嵌套对象,建议在换前将其序列化为 JSON 字符串[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值