{"record":{"id":"de92f3da8953dac8","repo":"theonedev/onedev","slug":"reviewer-not-found","errorCode":null,"errorMessage":"Reviewer not found: ","messagePattern":"Reviewer not found: ","errorType":"http","errorClass":"NotFoundException","httpStatus":404,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/ai/TodResource.java","lineNumber":1169,"sourceCode":"        request.getUpdates().add(update);\n\n        var title = (String) data.remove(\"title\");\n        if (title == null)\n            throw new NotAcceptableException(\"Title is required\");\n\n        request.setTitle(title);\n\n        var description = (String) data.remove(\"description\");\n        if (description != null)\n            request.setDescription(description);\n\n        @SuppressWarnings(\"unchecked\")\n        var reviewerNames = (List<String>) data.remove(\"reviewers\");\n        if (reviewerNames != null) {\n            for (var reviewerName : reviewerNames) {\n                User reviewer = userService.findByName(reviewerName);\n                if (reviewer == null)\n                    throw new NotFoundException(\"Reviewer not found: \" + reviewerName);\n                if (reviewer.equals(request.getSubmitter()))\n                    throw new NotAcceptableException(\"Pull request submitter cannot be reviewer\");\n\n                if (request.getReview(reviewer) == null) {\n                    PullRequestReview review = new PullRequestReview();\n                    review.setRequest(request);\n                    review.setUser(reviewer);\n                    request.getReviews().add(review);\n                }\n            }\n        }\n\n        @SuppressWarnings(\"unchecked\")\n        var assigneeNames = (List<String>) data.remove(\"assignees\");\n        if (assigneeNames != null) {\n            for (var assigneeName : assigneeNames) {\n                User assignee = userService.findByName(assigneeName);\n                if (assignee == null)","sourceCodeStart":1151,"sourceCodeEnd":1187,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/ai/TodResource.java#L1151-L1187","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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."],"exampleFix":"// before\ndata.put(\"reviewers\", List.of(\"Alice Smith\"));\n// after\ndata.put(\"reviewers\", List.of(\"asmith\")); // exact login name","handlingStrategy":"validation","validationCode":"for (var name : (List<String>) data.getOrDefault(\"reviewers\", List.of())) {\n    if (userService.findByName(name) == null)\n        throw new IllegalArgumentException(\"Unknown reviewer: \" + name);\n}","typeGuard":null,"tryCatchPattern":"try {\n    callEditEndpoint(data);\n} catch (NotFoundException e) {\n    if (e.getMessage().startsWith(\"Reviewer not found\")) {\n        // strip the bad name from data.get(\"reviewers\") and retry\n    } else throw e;\n}","preventionTips":["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."],"tags":["pull-request","user-lookup","rest-api","onedev"],"backgroundTag":"user-not-found","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}