theonedev/onedev · error · NotFoundException
Reviewer not found:
Error message
Reviewer not found:
What it means
OneDev's AI TOD (pull-request creation/edit) endpoint resolves each name in the 'reviewers' array via userService.findByName(). If a name does not match any existing user, it throws a JAX-RS NotFoundException (HTTP 404) with the offending name appended. The whole request aborts before any review objects are created.
Source
Thrown at server-core/src/main/java/io/onedev/server/ai/TodResource.java:1169
request.getUpdates().add(update);
var title = (String) data.remove("title");
if (title == null)
throw new NotAcceptableException("Title is required");
request.setTitle(title);
var description = (String) data.remove("description");
if (description != null)
request.setDescription(description);
@SuppressWarnings("unchecked")
var reviewerNames = (List<String>) data.remove("reviewers");
if (reviewerNames != null) {
for (var reviewerName : reviewerNames) {
User reviewer = userService.findByName(reviewerName);
if (reviewer == null)
throw new NotFoundException("Reviewer not found: " + reviewerName);
if (reviewer.equals(request.getSubmitter()))
throw new NotAcceptableException("Pull request submitter cannot be reviewer");
if (request.getReview(reviewer) == null) {
PullRequestReview review = new PullRequestReview();
review.setRequest(request);
review.setUser(reviewer);
request.getReviews().add(review);
}
}
}
@SuppressWarnings("unchecked")
var assigneeNames = (List<String>) data.remove("assignees");
if (assigneeNames != null) {
for (var assigneeName : assigneeNames) {
User assignee = userService.findByName(assigneeName);
if (assignee == null)View on GitHub (pinned to d44925c47c)
Solutions
- Verify each name in the 'reviewers' list matches an existing OneDev user login name exactly (check admin > user list).
- Remove or correct the non-existent reviewer names and resubmit the request.
- Pre-resolve names via the user API before submitting to filter invalid ones.
Example fix
// before
data.put("reviewers", List.of("Alice Smith"));
// after
data.put("reviewers", List.of("asmith")); // exact login name Defensive patterns
Strategy: validation
Validate before calling
for (var name : (List<String>) data.getOrDefault("reviewers", List.of())) {
if (userService.findByName(name) == null)
throw new IllegalArgumentException("Unknown reviewer: " + name);
} Try / catch
try {
callEditEndpoint(data);
} catch (NotFoundException e) {
if (e.getMessage().startsWith("Reviewer not found")) {
// strip the bad name from data.get("reviewers") and retry
} else throw e;
} Prevention
- Keep an in-process cache of valid usernames fetched from the user API.
- Always use login names, never display names or emails.
- When plans come from an AI, cross-check mentioned people against the project's member list.
When it happens
Trigger: POST to the TodResource pull-request edit endpoint with data containing a 'reviewers' list where any entry is not an exact existing username (e.g. reviewers=["alice","bob123"] when no user 'bob123' exists).
Common situations: Typo in reviewer name; AI agent hallucinating a username; reviewer was renamed or deleted since the plan was generated; using email/display name instead of login name.
Understand the failure class
Background: "User not found", "Invalid user", and "does not exist": what missing-user lookup errors mean across Rocket.Chat, LiteLLM, Phabricator, rustfs, and pnpm — this error's family across 10 libraries.
Related errors
- Assignee not found:
- Pull request submitter cannot be reviewer
- No permission to read code of source project:
- No permission to read code of target project:
- No code in target project:
AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06).
Data as JSON: /api/errors/de92f3da8953dac8.
Report an issue: GitHub.