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

  1. Verify each name in the 'reviewers' list matches an existing OneDev user login name exactly (check admin > user list).
  2. Remove or correct the non-existent reviewer names and resubmit the request.
  3. 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

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


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/de92f3da8953dac8. Report an issue: GitHub.