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
- Convert the expression to Quartz format with a seconds field: '0 0/5 * * * ?' means every 5 minutes starting at second 0.
- Validate locally with org.quartz.CronExpression.isValidExpression(expr) before submitting.
- 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
- Remember Quartz cron has 6 fields and starts with SECONDS — never paste 5-field Linux crontab entries.
- Use a Quartz-specific cron builder UI in the frontend.
- Add the org.quartz dependency to the frontend's BFF or use a JS quartz-cron validator for instant feedback.
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
- A new quartzJob cannot already have an ID
- 非法的 Bean,请重新输入!
- 子任务中不能添加当前任务ID
- 文件超出规定大小:{maxSize}MB
- {entity} 不存在: {parameter} is {value}
AI-assisted analysis of elunez/eladmin@55fbf70595 (2026-08-14).
Data as JSON: /api/errors/e645897db89d418b.
Report an issue: GitHub.