jeecgboot/JeecgBoot · error · RuntimeException

jobinfo_field_id

jobinfo_field_id

Error message

jobinfo_field_id + system_invalid

What it means

Thrown by JobLogController.index when jobId > 0 but xxlJobInfoMapper.loadById(jobId) returns null. This means the user passed a specific job ID filter (e.g., via URL parameter ?jobId=999) for a job that does not exist. The message is a concatenation of two i18n keys: 'jobinfo_field_id' (label 'Job ID') + 'system_invalid' (label 'invalid'), producing something like 'Job ID invalid'.

Source

Thrown at jeecg-boot/jeecg-server-cloud/jeecg-visual/jeecg-cloud-xxljob/src/main/java/com/xxl/job/admin/business/controller/JobLogController.java:83

						@RequestParam(value = "jobId", required = false, defaultValue = "0") Integer jobId) {

		// 1、init JobGroupList
		// find all jobGroup
		List<XxlJobGroup> jobGroupListTotal =  xxlJobGroupMapper.findAll();

		// filter JobGroupList
		List<XxlJobGroup> jobGroupList = JobGroupPermissionUtil.filterJobGroupByPermission(request, jobGroupListTotal);
		if (CollectionTool.isEmpty(jobGroupList)) {
			throw new XxlJobException(I18nUtil.getString("jobgroup_empty"));
		}
		List<Integer> jobGroupIds = jobGroupList.stream().map(XxlJobGroup::getId).toList();

		// 2、check jobId
		if (jobId > 0) {
			// valid jobId
			XxlJobInfo jobInfo = xxlJobInfoMapper.loadById(jobId);
			if (jobInfo == null) {
				throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_invalid"));
			}
			// valid jobGroup
			jobGroup = jobInfo.getJobGroup();
		}

		// 3、init jobGroup, default first 1
		if (!jobGroupIds.contains(jobGroup)) {
			jobGroup = jobGroupList.get(0).getId();
		}

		// 4、init jobInfoList
		List<XxlJobInfo> jobInfoList = xxlJobInfoMapper.getJobsByGroup(jobGroup);
		List<Integer> jobIds = jobInfoList.stream().map(XxlJobInfo::getId).toList();

		// 5、init JobId, default 0
		if (!jobIds.contains(jobId)) {
			jobId = 0;
		}

View on GitHub (pinned to 96fb33f5ec)

Solutions

  1. Verify the job exists: SELECT id, job_desc FROM xxl_job_info WHERE id = <jobId>.
  2. If the job was deleted, navigate to the log page without the jobId filter (just /joblog) and select a valid job from the dropdown.
  3. Update or remove stale bookmarks that reference deleted jobIds.
  4. Add URL parameter validation on the frontend before loading the log page.

Example fix

// before: direct link with hardcoded jobId
<a href="/joblog?jobId=12345">View Logs</a>

// after: validate jobId before navigating
async function viewJobLogs(jobId) {
  const job = await api.get(`/jobinfo/loadById?id=${jobId}`);
  if (!job.data) {
    alert('Job does not exist. Redirecting to log list.');
    window.location.href = '/joblog';
    return;
  }
  window.location.href = `/joblog?jobId=${jobId}`;
}
Defensive patterns

Strategy: validation

Validate before calling

// Validate job exists before using jobId filter on log page
public boolean jobExists(int jobId) {
    if (jobId <= 0) return false;
    return xxlJobInfoMapper.loadById(jobId) != null;
}

Try / catch

try {
    return "business/job.log";
} catch (RuntimeException e) {
    if (e.getMessage().contains("system_invalid")) {
        model.addAttribute("error", "Specified job does not exist.");
        // Fall through without jobId filter
        return "business/job.log";
    }
    throw e;
}

Prevention

When it happens

Trigger: Navigating to the job log page with a URL like /joblog?jobId=99999 where job 99999 doesn't exist. The job was deleted but the user accessed a bookmarked filtered URL. The jobId parameter was manually entered incorrectly. Concurrent deletion of a job while a user has a filtered log view open.

Common situations: Stale bookmarks pointing to deleted jobs. Deep links shared between users where the target job was later removed. Copy-paste errors in the jobId URL parameter. Testing/debugging with hardcoded jobIds that no longer exist.

Related errors


AI-assisted analysis of jeecgboot/JeecgBoot@96fb33f5ec (2026-08-14). Data as JSON: /api/errors/d0d570868fb158d0. Report an issue: GitHub.