LinkedMultiValueMap中add,put,set方法

本文解析了LinkedMultiValueMap的数据结构及add、put、set方法的区别。通过实例演示了如何使用这些方法来模拟表单提交,并解释了它们在处理多值字段时的不同行为。

LinkedMultiValueMap中add,put,set方法

1、项目中在使用RestTemplate进行http请求时,会用到LinkedMultiValueMap。一开始总是把需要使用LinkedMultiValueMap的地方错用LinkedHashMap。现在简单分析一下LinkedMultiValueMap的数据结构

2、打开LinkedMultiValueMap的源码,可以看到里面封装的是一个Map,再看构造方法,最终创建的是一个LinkedHashMap。这个Map的value有点特别,他不能放任何值,必须是一个List。
其实LinkedMultiValueMap可以看作是一个表单,在表单中,一个name可以对应很多值,比如根据id批量删除,一个key需要对应很多需要删除的id

在这里插入图片描述
3. add/put/set方法

public static void main(String[] args) {
    MultiValueMap params = new LinkedMultiValueMap();

    params.add("username","张三");
    params.add("username","李四");
    System.out.println(params);

    params.put("password", Arrays.asList("1234"));
    System.out.println(params);

    params.set("username","王五");
    System.out.println(params);
}
// 输出结果如下
{username=[张三, 李四]}
{username=[张三, 李四], password=[1234]}
{username=[王五], password=[1234]}

4、通过源码分析

add是把值放到list中,若map中没有key对应的list,先new一个LinkedList
在这里插入图片描述

put直接接收list
在这里插入图片描述

set不管原来怎么样,都会重新new一个LinkedList,再把值放进去
在这里插入图片描述

5、回到最开始的问题,到底什么时候使用LinkedMultiValueMap,答案就是模拟普通的表单提交时。

package com.ecinc.hygl.ytap.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ecinc.base.organization.entity.Organization; import com.ecinc.base.organization.service.OrganMgrService; import com.ecinc.base.organization.vo.LinkMan; import com.ecinc.base.paramConfig.service.ParamConfigService; import com.ecinc.common.constants.Constants; import com.ecinc.common.constants.StatusV; import com.ecinc.common.service.impl.BaseServiceImpl; import com.ecinc.common.utils.DateUtil; import com.ecinc.common.utils.I18nUtil; import com.ecinc.common.utils.StringUtil; import com.ecinc.common.utils.SystemUtil; import com.ecinc.common.vo.JsonResult; import com.ecinc.hygl.ytRecord.entity.YtRecord; import com.ecinc.hygl.ytRecord.service.YtRecordService; import com.ecinc.hygl.ytap.controller.YtapController; import com.ecinc.hygl.ytap.entity.Ytap; import com.ecinc.hygl.ytap.mapper.YtapMapper; import com.ecinc.hygl.ytap.service.YtapService; import com.ecinc.hygl.ytsj.entity.Ytsj; import com.ecinc.hygl.ytsj.service.YtsjService; import com.ecinc.hygl.ytsjInfo.entity.YtsjInfo; import com.ecinc.hygl.ytsjInfo.service.YtsjInfoService; import com.ecinc.oahth.login.client.LoginFeignClient; import com.ecinc.workflow.contants.WorkflowConstants; import com.ecinc.workflow.exceptions.WorkflowException; import com.ecinc.workflow.wfEngine.client.WfEngineClient; import com.ecinc.workflow.wfEngine.vo.CurTaskNode; import com.ecinc.workflow.wfEngine.vo.SubmitHandleData; import com.ecinc.workflow.wfInstance.entity.WfBusiAttach; import com.ecinc.workflow.wfInstance.entity.WfInstance; import com.ecinc.workflow.wfInstance.service.WfBusiAttachService; import com.google.common.collect.ImmutableMap; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import java.util.*; import java.util.stream.Collectors; import com.alibaba.fastjson2.JSONArray; import com.ecinc.common.vo.Pager; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 描述:Ytap服务实现层 * * @author ecinc * @date 2020-09-15 */ @Service("ytapService") public class YtapServiceImpl extends BaseServiceImpl<Ytap> implements YtapService { @SuppressWarnings("unused") @Autowired private YtapMapper ytapMapper; @Autowired private OrganMgrService organMgrService; @Autowired @Lazy private WfEngineClient wfEngineClient; @Autowired private YtapController ytapController; @Autowired private YtRecordService ytRecordService; @Autowired private WfBusiAttachService wfBusiAttachService; @Autowired private YtsjInfoService ytsjInfoService; @Autowired private YtsjService ytsjService; @Autowired private ParamConfigService paramConfigService; @Autowired @Lazy private LoginFeignClient loginFeignClient; @Value("${eccloud.client.account}") private String clientAccount; @Value("${eccloud.client.password}") private String clientPassword; private static String jtid = SystemUtil.genRandomStr(6); // 定时任务下发任务 public void timingStartYt() throws WorkflowException, NoSuchFieldException { String wfName = "会议议题"; String startNodeName = "拟稿"; String jobPositionCode = "deptFileManager"; List<YtsjInfo> ytsjInfos = ytsjInfoService.selectListByWhereSql("STATUS = 0 AND (SEND_TIME <= '" + DateUtil.formatCurrentDateTime() + "' or SEND_TYPE = 0 or SEND_TYPE IS NULL)", "createDate asc"); if (ytsjInfos != null) { // parentId 分组 Map<String, List<YtsjInfo>> groupedByParentId = ytsjInfos.stream() .collect(Collectors.groupingBy(YtsjInfo::getParentId)); Set<Map.Entry<String, List<YtsjInfo>>> entries = groupedByParentId.entrySet(); for (Map.Entry<String, List<YtsjInfo>> entry : entries) { String key = entry.getKey(); List<YtsjInfo> value = entry.getValue(); JsonResult result = startYt(wfName, startNodeName, value, jobPositionCode); if (JsonResult.SUCCESS_CODE.equals(result.getCode())) { if (result.getBody().containsKey("successDeptMap")) { // 更新收集相关部门信息 Map<String, Object> successDeptMap = new LinkedHashMap<>(JSONObject.parseObject(JSONObject.toJSONString(result.getBody().get("successDeptMap")))); List<String> deptIdList = new ArrayList<>(); List<String> deptNameList = new ArrayList<>(); for (String deptId : successDeptMap.keySet()) { if(!deptIdList.contains(deptId)) { deptIdList.add(deptId); deptNameList.add(String.valueOf(successDeptMap.get(deptId))); } } Ytsj oldYtsj = ytsjService.selectById(key); String deptId = oldYtsj.getDeptId(); List<String> oldDeptIdList = new ArrayList<>(Arrays.asList(deptId.split(","))); oldDeptIdList.addAll(deptIdList); oldDeptIdList.stream().distinct().collect(Collectors.toList()); List<Organization> allOrganByOrgCode = organMgrService.findAllOrganByOrgCode(oldYtsj.getOrgCode(), null, null); allOrganByOrgCode = allOrganByOrgCode.stream().filter(item -> oldDeptIdList.contains(item.getId())).collect(Collectors.toList()); oldYtsj.setDeptId(String.join(",", allOrganByOrgCode.stream().map(Organization::getId).collect(Collectors.toList()))); oldYtsj.setDeptName(String.join(",", allOrganByOrgCode.stream().map(Organization::getName).collect(Collectors.toList()))); oldYtsj.setStatus((short) 1);// 进行中 ytsjService.updateSelective(oldYtsj); } } } } } @Override public JsonResult startYt(String wfName, String startNodeName, List<YtsjInfo> ytsjInfos, String jobPositionCode) throws WorkflowException, NoSuchFieldException { // 消息内容 StringJoiner message = new StringJoiner(";"); // 成功生成流程部门 Map<String, Object> successDeptMap = new LinkedHashMap<>(); JsonResult result = JsonResult.success(); // 模拟生成提交数据 SubmitHandleData submitHandle = new SubmitHandleData(); submitHandle.setSubmitType(WorkflowConstants.WF_SUBMIT_TYPE_SUBMIT); submitHandle.setOpenUrl("/wflow?wfEngineUrl=hygl/ytap"); List<String> personIds = ytsjInfos.stream().map(YtsjInfo::getPersonId).collect(Collectors.toList()); List<LinkMan> linkManList = new ArrayList<>(); try { linkManList = organMgrService.findLinkManByOrgIdAndPersonIds(null, personIds.toArray(new String[personIds.size()])); } catch(Exception e) { logger.info("查询人员信息失败!重新获取token后再尝试!"); try { String value = ""; String token = "session:access_token:" + Constants.CLIENT_PRODUCT_CODE + ":" + jtid; JSONObject oauthToken = this.loginFeignClient.oauthToken("client_credentials", "select", this.clientAccount, this.clientPassword); value = oauthToken.getString("value"); this.redisService.set(token, value); logger.info("重新生成access_token成功,再次调用查询人员信息"); }catch (Exception e1){ e1.printStackTrace(); } linkManList = organMgrService.findLinkManByOrgIdAndPersonIds(null, personIds.toArray(new String[personIds.size()])); } for (YtsjInfo ytsjInfo : ytsjInfos) { // 对某些需要赋值到下发议题对象的属性进行赋值 Ytap busiData = new Ytap(); busiData.setFlSubject(ytsjInfo.getContent()); busiData.setYtsjId(ytsjInfo.getParentId()); busiData.setYtsjName(ytsjInfo.getContent()); busiData.setFlContent(ytsjInfo.getRemark()); busiData.setYtsjInfoId(ytsjInfo.getId()); busiData.setDeptId(ytsjInfo.getDeptId()); busiData.setDeptName(ytsjInfo.getDeptName()); busiData.setPersonId(ytsjInfo.getPersonId()); busiData.setPersonName(ytsjInfo.getPersonName()); busiData.setWfNodeNames(startNodeName); busiData.setEndTime(ytsjInfo.getEndTime()); busiData.setFlSubjectType(ytsjInfo.getSubjectType()); busiData.setFlSubjectTypeName(ytsjInfo.getSubjectTypeName()); if(ytsjInfo.getEndTime() != null) { busiData.setApplyEdnTime(DateUtil.format(ytsjInfo.getEndTime(), DateUtil.DATE_TIME_PATTERN)); } LinkMan jobPositionMAN = null; if (StringUtil.isNotBlank(ytsjInfo.getPersonId())){ jobPositionMAN = linkManList.stream().filter(item -> ytsjInfo.getPersonId().equals(item.getPersonId())).findFirst().orElse(null); } else { Organization department = organMgrService.getOrganizationById(ytsjInfo.getDeptId()); // 获取下发岗位成员们 List<LinkMan> linkMEN = organMgrService.findLinkManByJobPositionCode(new String[]{ytsjInfo.getOrgCode()}, jobPositionCode); // 获取对应部门岗位成员 jobPositionMAN = linkMEN.stream().filter(linkMan -> linkMan.getOrgFullId().contains(ytsjInfo.getDeptId())).findFirst().orElse(null); if (jobPositionMAN == null) { List<LinkMan> deptLinkMan = organMgrService.findLinkManByOrgId(department.getId(), true, null); if (deptLinkMan != null && deptLinkMan.size() > 0) { jobPositionMAN = deptLinkMan.get(0); } else { logger.error(department.getId() + ":" + department.getName() + "未找到" + jobPositionCode + "岗位成员!"); message.add(I18nUtil.message("ytap.startYt.noPositionMembers.failure", new Object[]{department.getName(),jobPositionCode})); continue; } } ytsjInfo.setPersonId(jobPositionMAN.getPersonId()); ytsjInfo.setPersonName(jobPositionMAN.getName()); ytsjInfoService.update(ytsjInfo); } // 启动流程 CurTaskNode curTN = new CurTaskNode(); curTN.setStaffID(jobPositionMAN.getId()); curTN.setUserName(jobPositionMAN.getName()); curTN.setUserAccount(jobPositionMAN.getAccount()); curTN.setStaffOrgID(jobPositionMAN.getOrgFullId()); curTN.setStaffOrderNo(jobPositionMAN.getOrgFullOrderNo()); curTN.setStaffOrgName(jobPositionMAN.getOrgFullName()); // 初始化一个新流程实例,未保存 MultiValueMap<String, Object> formParms = new LinkedMultiValueMap<>(); formParms.add("orgCode", ytsjInfo.getOrgCode()); formParms.add("orgName", ytsjInfo.getOrgName()); /*wfName = paramConfigService.findParamValueByName(ytsjInfo.getOrgCode(), "hygl.ytap.wfName", "会议议题"); startNodeName = paramConfigService.findParamValueByName(ytsjInfo.getOrgCode(), "hygl.ytap.startNodeName", "拟稿");*/ formParms.add("wfName", wfName); formParms.add("startNodeName", startNodeName); formParms.add("curTN", JSON.toJSONString(curTN)); formParms.add("elevel", 0); result = wfEngineClient.startWfInstance(formParms); if (JsonResult.SUCCESS_CODE.equals(result.getCode())) { // 接收人员 String receiveUsers = jobPositionMAN.getOrgFullName() + ":" + jobPositionMAN.getName() + "/" + jobPositionMAN.getAccount() + "@" + jobPositionMAN.getId(); WfInstance wfInstance = JSONObject.parseObject(JSONObject.toJSONString(result.getBody().get("wfInstance")), WfInstance.class); curTN = JSON.parseObject(JSON.toJSONString(result.getBody().get("curTN")), CurTaskNode.class); wfInstance.setModule("ytap"); wfInstance.setTitle(busiData.getFlSubject()); if (curTN.getPassenger().containsKey("startNode")) { submitHandle.setNextTNProp(new String[]{(String) curTN.getPassenger().get("startNode")}); } // 创建busiData busiData = createBusiData(wfInstance, jobPositionMAN, busiData); submitHandle.setNextTNUser(new String[]{receiveUsers}); wfInstance.getPassenger().put("busiData", JSON.toJSON(busiData)); // 保存流程实例 result = ytapController.saveWfInstance(wfInstance, curTN, submitHandle); if (JsonResult.SUCCESS_CODE.equals(result.getCode())) { ytsjInfo.setStatus(StatusV.YES); ytsjInfo.setStartTime(new Date()); ytsjInfoService.update(ytsjInfo); successDeptMap.put(ytsjInfo.getDeptId(), ytsjInfo.getDeptName()); } else { message.add(I18nUtil.message("ytap.startYt.saveWf.failure", new Object[]{ytsjInfo.getDeptName()})); } } else { message.add(I18nUtil.message("ytap.startYt.startWf.failure", new Object[]{ytsjInfo.getDeptName()})); } } if (StringUtil.isNotBlank(message.toString())) { result.setCode(JsonResult.FAILURE_CODE); result.setMessage(message.toString()); } result.getBody().put("successDeptMap", successDeptMap); return result; } public Ytap createBusiData(WfInstance wfInstance, LinkMan linkMAN, Ytap busiData) { busiData.setId(wfInstance.getBusiDataId()); String dept = linkMAN.getOrgFullName().split("-")[linkMAN.getOrgFullName().split("-").length - 1]; busiData.setFlCreateDept(dept); busiData.setCreatorId(linkMAN.getPersonId()); busiData.setFlCreateDate(new Date()); busiData.setFlCreatorPhone(linkMAN.getMobile()); busiData.setFlCreator(linkMAN.getName()); busiData.setOrgFullId(linkMAN.getOrgFullId()); busiData.setOrgCode(wfInstance.getOrgCode()); busiData.setOrgName(wfInstance.getOrgName()); busiData.setFlFormSerial(DateUtil.formatCurrent("yyyyMMdd") + SystemUtil.genRandomStr(4).toUpperCase()); busiData.setFlFormName(wfInstance.getWfName()); busiData.setStatus(wfInstance.getStatus()); return busiData; } }
最新发布
08-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值