There are still a couple of issues with this approach:

1) If the deployed Job has `JobParametersIncrementer` set, then the launch() would increment the jobParameter before launching:
In *JobLaunchRequestTransformer*'s toJobLaunchRequest(Message):

```
if (job.getJobParametersIncrementer() != null) {
			jobParameters = job.getJobParametersIncrementer().getNext(jobParameters);
		}
```
In case of JobExecution restart(), we want to use the same JobParameter.

2) If the Job has "random" job parameter, the controller makes sure to remove it. But, at *JobLaunchRequestTransformer* the  "random" job parameter is generated again here:

```
else if (payload instanceof String) {
			jobParameters = jobParametersConverter.getJobParametersForJsonString((String) payload);
		}
```
This causes the following check in *SimpleJobLauncher*'s run() not handled:

```
if (lastExecution != null) {
			if (!job.isRestartable()) {
				throw new JobRestartException("JobInstance already exists and is not restartable");
			}
			/*
			 * validate here if it has stepExecutions that are UNKNOWN
			 * retrieve the previous execution and check
			 */
			for (StepExecution execution : lastExecution.getStepExecutions()) {
				if (execution.getStatus() == BatchStatus.UNKNOWN) {
					//throw
					throw new JobRestartException("Step [" + execution.getStepName() + "] is of status UNKNOWN");
				}//end if
			}//end for
		}
```