elunez/eladmin · error · BadRequestException

cron表达式格式错误

Error message

cron表达式格式错误

What it means

QuartzJobServiceImpl.create validates the job's cronExpression with Quartz's CronExpression.isValidExpression before saving and scheduling. An invalid 6/7-field cron string (seconds minutes hours day-of-month month day-of-week [year]) throws this BadRequestException and the transaction rolls back, so no job row or trigger is created.

Source

Thrown at eladmin-system/src/main/java/me/zhengjie/modules/quartz/service/impl/QuartzJobServiceImpl.java:82

    }

    @Override
    public List<QuartzLog> queryAllLog(JobQueryCriteria criteria) {
        return quartzLogRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder));
    }

    @Override
    public QuartzJob findById(Long id) {
        QuartzJob quartzJob = quartzJobRepository.findById(id).orElseGet(QuartzJob::new);
        ValidationUtil.isNull(quartzJob.getId(),"QuartzJob","id",id);
        return quartzJob;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void create(QuartzJob resources) {
        if (!CronExpression.isValidExpression(resources.getCronExpression())){
            throw new BadRequestException("cron表达式格式错误");
        }
        resources = quartzJobRepository.save(resources);
        quartzManage.addJob(resources);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(QuartzJob resources) {
        if (!CronExpression.isValidExpression(resources.getCronExpression())){
            throw new BadRequestException("cron表达式格式错误");
        }
        if(StringUtils.isNotBlank(resources.getSubTask())){
            List<String> tasks = Arrays.asList(resources.getSubTask().split("[,,]"));
            if (tasks.contains(resources.getId().toString())) {
                throw new BadRequestException("子任务中不能添加当前任务ID");
            }
        }
        resources = quartzJobRepository.save(resources);

View on GitHub (pinned to 55fbf70595)

Solutions

  1. Convert the expression to Quartz format with a seconds field: '0 0/5 * * * ?' means every 5 minutes starting at second 0.
  2. Validate locally with org.quartz.CronExpression.isValidExpression(expr) before submitting.
  3. Use a Quartz-aware cron generator and remember day-of-month and day-of-week cannot both be '*' — one must be '?'.

Example fix

// before (Linux crontab syntax, 5 fields -> rejected)
"*/5 * * * *"
// after (Quartz syntax, 6 fields)
"0 */5 * * * ?"
Defensive patterns

Strategy: validation

Validate before calling

// validate before submit, using the same Quartz validator the server uses
import org.quartz.CronExpression;
if (!CronExpression.isValidExpression(expr)) {
    throw new IllegalArgumentException("Invalid Quartz cron (need 6-7 fields): " + expr);
}

Type guard

boolean isValidQuartzCron(String s) {
    return s != null && org.quartz.CronExpression.isValidExpression(s.trim());
}

Prevention

When it happens

Trigger: POST /api/quartz/jobs (or the equivalent UI action) with a malformed cron such as '0 0 * * *' (5-field Linux crontab syntax), 'every 5 minutes', '* * *', or fields out of range. Quartz cron requires exactly 6 or 7 space-separated fields and its own special-character rules.

Common situations: Developers pasting Unix crontab syntax (5 fields) — the single most common cause; using '?' on the wrong field; day-of-week names vs numbers confusion; spaces instead of nothing between fields; online cron generators that target Linux cron rather than Quartz.

Related errors


AI-assisted analysis of elunez/eladmin@55fbf70595 (2026-08-14). Data as JSON: /api/errors/e645897db89d418b. Report an issue: GitHub.