{"record":{"id":"9c7c7a56a1a896cb","repo":"theonedev/onedev","slug":"no-issue-in-query-context","errorCode":null,"errorMessage":"No issue in query context","messagePattern":"No issue in query context","errorType":"exception","errorClass":"ExplicitException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/search/entity/issue/CurrentIssueCriteria.java","lineNumber":23,"sourceCode":"import javax.persistence.criteria.CriteriaQuery;\nimport javax.persistence.criteria.From;\nimport javax.persistence.criteria.Predicate;\n\nimport io.onedev.commons.utils.ExplicitException;\nimport io.onedev.server.model.Issue;\nimport io.onedev.server.util.ProjectScope;\nimport io.onedev.server.util.criteria.Criteria;\n\npublic class CurrentIssueCriteria extends Criteria<Issue> {\n\n\tprivate static final long serialVersionUID = 1L;\n\t\n\t@Override\n\tpublic Predicate getPredicate(@Nullable ProjectScope projectScope, CriteriaQuery<?> query, From<Issue, Issue> from, CriteriaBuilder builder) {\n\t\tif (Issue.get() != null)\n\t\t\treturn builder.equal(from, Issue.get());\n\t\telse\n\t\t\tthrow new ExplicitException(\"No issue in query context\");\n\t}\n\n\t@Override\n\tpublic boolean matches(Issue issue) {\n\t\tif (Issue.get() != null)\n\t\t\treturn Issue.get().equals(issue);\n\t\telse\n\t\t\tthrow new ExplicitException(\"No issue in query context\");\n\t}\n\n\t@Override\n\tpublic String toStringWithoutParens() {\n\t\treturn IssueQuery.getRuleName(IssueQueryLexer.CurrentIssue);\n\t}\n\n}\n","sourceCodeStart":5,"sourceCodeEnd":40,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/search/entity/issue/CurrentIssueCriteria.java#L5-L40","documentation":"CurrentIssueCriteria.getPredicate() resolves the '~current issue~' operator to the issue bound to the current execution context via Issue.get(). OneDev sets this only in issue-scoped contexts (e.g. pages within an issue, pull request/build pipelines referencing an issue). With no current issue, it throws ExplicitException('No issue in query context').","triggerScenarios":"Running an issue query containing '~current issue~' in a context where no issue is associated: global issue list search, REST API call, scheduled job, or project-level board where Issue.get() is null.","commonSituations":"Using '~current issue~' in saved/global queries instead of only inside issue detail contexts; calling it from a build or PR script without issue linkage; testing queries from admin consoles.","solutions":["Only use '~current issue~' in contexts where an issue is active (issue page, linked build/PR context).","Replace with the explicit issue number criteria (e.g. '~\"number\" is 123~') for general queries.","Catch ExplicitException and degrade gracefully (skip criteria or notify the user).","If embedding in dashboards, pass the issue via the appropriate context/impersonation API."],"exampleFix":"// before\nString query = \"~current issue~\"; // evaluated in global list -> throws\n\n// after\nString query = Issue.get() != null ? \"~current issue~\" : \"~\\\"number\\\" is 123\";","handlingStrategy":"try-catch","validationCode":"if (Issue.get() == null) { /* use explicit issue number instead of '~current issue~' */ }","typeGuard":"Issue current = Issue.get(); boolean hasContext = current != null;","tryCatchPattern":"try { issues = queryManager.find(null, \"~current issue~\"); } catch (ExplicitException e) { issues = queryManager.find(null, \"~\\\"number\\\" is \" + fallbackNumber); }","preventionTips":["Use '~current issue~' only in issue-bound contexts (issue page, linked build/PR)","Prefer explicit issue number filters for global/saved queries","Catch ExplicitException around contextual query evaluation"],"tags":["onedev","query-context","issue-query"],"backgroundTag":"missing-required-context","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}