The problem that a specific type of parameter cannot be resolved by sending a request through restTemplate

The client sends the request through the RestTemplate, and the requestBody is a complex data type. The data types required by the server are combined by nesting multi-level MultiValueMap.

HttpEntity requestBody = generateAddAllRequestBody(strategyJobs);
ResponseEntity<String> responseEntity = this.restTemplate.postForEntity(jobAddAllUrl, requestBody, String.class);
 private HttpEntity generateAddAllRequestBody(List<StrategyJob> strategyJobs) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        MultiValueMap<String, MultiValueMap> outerMap = new LinkedMultiValueMap<>();
        for(StrategyJob strategyJob : strategyJobs) {
            MultiValueMap map = new LinkedMultiValueMap();
            map.add("jobGroup",strategyJob.getGroup());
            map.add("jobDesc", strategyJob.getJobDesc());
            map.add("executorRouteStrategy", "FIRST");
            map.add("cronGen_display", strategyJob.getCron());
            map.add("jobCron", strategyJob.getCron());
            map.add("glueType", "BEAN");
            map.add("executorHandler", strategyJob.getExecutorHandler());
            map.add("executorBlockStrategy", "SERIAL_EXECUTION");
            map.add("childJobId", "");
            map.add("executorTimeout", 0);
            map.add("executorFailRetryCount", 0);
            map.add("author", strategyJob.getCreator());
            map.add("alarmEmail", "");
            map.add("executorParam", strategyJob.getStrategyId());
            map.add("glueRemark", "GLUE Code initialization");
            map.add("glueSource", "");
            map.add("triggerStatus", 1);

            if (strategyJob.getId() != null) {
                map.add("id", strategyJob.getId());
            }
            outerMap.add(strategyJob.getKey(), map);
        }
        HttpEntity requestBody = new HttpEntity(outerMap, headers);
        return requestBody;
    }

When the server receives the request, it can only parse the key value value of the first layer. The complex data type in value cannot be parsed and an exception occurs. At this time, a Converter needs to be added in the server to convert the default String type to the corresponding complex type:

package com.xxl.job.admin.core.converter;

import com.alibaba.fastjson.JSON;
import com.xxl.job.admin.core.model.XxlJobInfo;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

@Component
public class String2XxlJobInfo implements Converter<String, XxlJobInfo> {

    @Override
    public XxlJobInfo convert(String s) {
        String ss = s.replaceAll("[\\[\\]]", "");
        XxlJobInfo xxlJobInfo = JSON.parseObject(ss, XxlJobInfo.class);
        return xxlJobInfo;
    }
}

The server's controller method is:

	@RequestMapping("/addStrategyJobs")
	@ResponseBody
	@PermissionLimit(limit=false)
	public ReturnT<List<String>> addStrategyJobs(StrategyJobInfo strategyJobInfo) {
		return xxlJobService.addStrategyJobs(strategyJobInfo);
	}

The code of StrategyJobInfo is as follows:

package com.xxl.job.admin.core.model;

public class StrategyJobInfo {

    XxlJobInfo preApplyJob;
    XxlJobInfo applyJob;
    XxlJobInfo preRestoreJob;
    XxlJobInfo restoreJob;

    public XxlJobInfo getPreApplyJob() {
        return preApplyJob;
    }

    public void setPreApplyJob(XxlJobInfo preApplyJob) {
        this.preApplyJob = preApplyJob;
    }

    public XxlJobInfo getApplyJob() {
        return applyJob;
    }

    public void setApplyJob(XxlJobInfo applyJob) {
        this.applyJob = applyJob;
    }

    public XxlJobInfo getPreRestoreJob() {
        return preRestoreJob;
    }

    public void setPreRestoreJob(XxlJobInfo preRestoreJob) {
        this.preRestoreJob = preRestoreJob;
    }

    public XxlJobInfo getRestoreJob() {
        return restoreJob;
    }

    public void setRestoreJob(XxlJobInfo restoreJob) {
        this.restoreJob = restoreJob;
    }
}

The code of XxlJobInfo is as follows:

package com.xxl.job.admin.core.model;

import java.util.Date;

/**
 * xxl-job info
 *
 * @author xuxueli  2016-1-12 18:25:49
 */
public class XxlJobInfo {
	
	private int id;				// Primary key ID
	
	private int jobGroup;		// Actuator primary key ID
	private String jobCron;		// Task execution CRON expression
	private String jobDesc;
	
	private Date addTime;
	private Date updateTime;
	
	private String author;		// Person in charge
	private String alarmEmail;	// Alarm mail

	private String executorRouteStrategy;	// Actuator routing policy
	private String executorHandler;		    // Actuator, task Handler name
	private String executorParam;		    // Actuator, task parameters
	private String executorBlockStrategy;	// Blocking handling strategy
	private int executorTimeout;     		// Task execution timeout in seconds
	private int executorFailRetryCount;		// Failed retries
	
	private String glueType;		// GLUE type ා com.xxl.job.core.GLUE.gluetype enum
	private String glueSource;		// GLUE source code
	private String glueRemark;		// GLUE remarks
	private Date glueUpdatetime;	// GLUE update time

	private String childJobId;		// Subtask ID, multiple comma separated

	private int triggerStatus;		// Scheduling status: 0-stop, 1-run
	private long triggerLastTime;	// Last scheduled
	private long triggerNextTime;	// Next scheduling time


	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getJobGroup() {
		return jobGroup;
	}

	public void setJobGroup(int jobGroup) {
		this.jobGroup = jobGroup;
	}

	public String getJobCron() {
		return jobCron;
	}

	public void setJobCron(String jobCron) {
		this.jobCron = jobCron;
	}

	public String getJobDesc() {
		return jobDesc;
	}

	public void setJobDesc(String jobDesc) {
		this.jobDesc = jobDesc;
	}

	public Date getAddTime() {
		return addTime;
	}

	public void setAddTime(Date addTime) {
		this.addTime = addTime;
	}

	public Date getUpdateTime() {
		return updateTime;
	}

	public void setUpdateTime(Date updateTime) {
		this.updateTime = updateTime;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getAlarmEmail() {
		return alarmEmail;
	}

	public void setAlarmEmail(String alarmEmail) {
		this.alarmEmail = alarmEmail;
	}

	public String getExecutorRouteStrategy() {
		return executorRouteStrategy;
	}

	public void setExecutorRouteStrategy(String executorRouteStrategy) {
		this.executorRouteStrategy = executorRouteStrategy;
	}

	public String getExecutorHandler() {
		return executorHandler;
	}

	public void setExecutorHandler(String executorHandler) {
		this.executorHandler = executorHandler;
	}

	public String getExecutorParam() {
		return executorParam;
	}

	public void setExecutorParam(String executorParam) {
		this.executorParam = executorParam;
	}

	public String getExecutorBlockStrategy() {
		return executorBlockStrategy;
	}

	public void setExecutorBlockStrategy(String executorBlockStrategy) {
		this.executorBlockStrategy = executorBlockStrategy;
	}

	public int getExecutorTimeout() {
		return executorTimeout;
	}

	public void setExecutorTimeout(int executorTimeout) {
		this.executorTimeout = executorTimeout;
	}

	public int getExecutorFailRetryCount() {
		return executorFailRetryCount;
	}

	public void setExecutorFailRetryCount(int executorFailRetryCount) {
		this.executorFailRetryCount = executorFailRetryCount;
	}

	public String getGlueType() {
		return glueType;
	}

	public void setGlueType(String glueType) {
		this.glueType = glueType;
	}

	public String getGlueSource() {
		return glueSource;
	}

	public void setGlueSource(String glueSource) {
		this.glueSource = glueSource;
	}

	public String getGlueRemark() {
		return glueRemark;
	}

	public void setGlueRemark(String glueRemark) {
		this.glueRemark = glueRemark;
	}

	public Date getGlueUpdatetime() {
		return glueUpdatetime;
	}

	public void setGlueUpdatetime(Date glueUpdatetime) {
		this.glueUpdatetime = glueUpdatetime;
	}

	public String getChildJobId() {
		return childJobId;
	}

	public void setChildJobId(String childJobId) {
		this.childJobId = childJobId;
	}

	public int getTriggerStatus() {
		return triggerStatus;
	}

	public void setTriggerStatus(int triggerStatus) {
		this.triggerStatus = triggerStatus;
	}

	public long getTriggerLastTime() {
		return triggerLastTime;
	}

	public void setTriggerLastTime(long triggerLastTime) {
		this.triggerLastTime = triggerLastTime;
	}

	public long getTriggerNextTime() {
		return triggerNextTime;
	}

	public void setTriggerNextTime(long triggerNextTime) {
		this.triggerNextTime = triggerNextTime;
	}
}

Reference resources

Tags: Programming JSON Java

Posted on Fri, 08 Nov 2019 10:08:37 -0500 by Cloud9247